zoukankan      html  css  js  c++  java
  • Hibernate-检索策略

    一、立即检索策略的缺点:
    1、select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查
    询语句。这种检索策略没有利用SQL的连接查询功能,例如以上5条select语句完全可以通过以下1条select语句来完成:
    select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID=ORDERS.CUSTOMER_ID 
        以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出CUSTOMERS表的所有记录,以及匹配的ORDERS表的记录。
    2、在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。
     
     
    二、延迟检索策略
    如:对于<set>元素,应该优先考虑使用延迟检索策略:<set  name="orders"   inverse="true"    lazy="true" >
    优点
    由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间。
    缺点应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化。
    适用范围:(1)一对多或者多对多关联。(2)应用程序不需要立即访问或者根本不会访问的对象。
     
     
    三、在多对一关联级别使用迫切左外连接检索策略 
    如果把Order.hbm.xml文件的<many-to-one>元素的fetch属性设为join,则使用迫切左外连接检索策略。
    优点:
    (1)对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。
    (2)使用了外连接,select语句数目少。
    缺点:
    (1)可能会加载应用程序不需要访问的对象,白白浪费许多内存空间。
    (2)复杂的数据库表连接也会影响检索性能。
    适用范围:
    (1)多对一或者一对一关联。
    (2)应用程序需要立即访问的对象。
    (3)数据库系统具有良好的表连接性能
     
    四、在程序中显式指定迫切左外连接检索策略
    session .createQuery("from Customer as c left join fetch c.orders where c.id=1").list();
    在执行查询方法时,在HQL语句中显式指定迫切左外连接检索关联的Order对象,因此会覆盖映射文件配置的检索策略。不管在Customer.hbm.xml文件中<set>元素的lazy属性是true还是false,Hibernate都会执行以下select语句:
    select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID =ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
  • 相关阅读:
    CSS3 字体
    capitalized-comments (Rules) – Eslint 中文开发手册
    heapq (Data Types) – Python 中文开发手册
    Java中的Java.lang.Math类| 1
    shell脚本的条件测试与比较
    centos7关闭防火墙
    vmwaretool安装
    mongodb
    php中0与空 Null false的区别
    git使用总结
  • 原文地址:https://www.cnblogs.com/gy19920604/p/5379117.html
Copyright © 2011-2022 走看看