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;
posted @ 2016-04-11 17:05  gaungyao.wu  阅读(128)  评论(0编辑  收藏  举报