Hibernate笔记=>检索策略
Hibernate提供以下检索策略:
==> 立即检索
==> 延迟检索
==> 迫切左外连接检索
总结一下优缺点和优先考虑使用的场合
1、立即检索:
优点:
对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地从一个对象导航到与它关联的对象。
缺点:
[1]select语句数目多
[2]可能会加载应用程序不需要访问的对象,浪费时间和内存空间
优先考虑使用的场合:
[1]类级别
[2]应用程序需要立即访问的对象
[3]使用了二级缓存
2、延迟检索:
优点:
由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且节省内存空间
缺点:
应用程序如果需要访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化。
优先考虑使用的场合:
[1]一对多或者多对多关联
[2]应用程序不需要立即访问或者根本不访问的对象
3、迫切左外连接检索:
优点:
[1]对应用程序完全透明,不管对象处于之久化状态还是游离状态,应用程序都可以方便的从一个对象导航到另一个与它关联的对象。
[2]使用了外连接,select语句数目少
缺点:
[1]可能会加载应用程序不需要访问的对象,浪费内存空间
[2]复杂的数据表连接会影响检索性能
优先考虑使用的场合:
[1]多对一或者一对一关联
[2]应用程序需要立即访问的对象
[3]数据库系统具有良好的表连接性能
简单总结一下
select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID=ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
select * from CUSTOMERS where ID=1;
select * from ORDERS where CUSTOMER_ID=1;
不断的调节检索策略,以便在减少select语句数量和降低select语句复杂度之间找到一个平衡点,获取最佳的检索性能。
具体MappingXML中的配置
了解了各自的优缺点,该到动手配置的时候了。以下几个属性用来控制检索策略:
lazy:可选值为true和false,在<class>和<set>中有此属性,默认值为false,如果为true表示延迟检索。
outer-join:可选值为auto,true和false,在<many-to-one>,<one-to-one>和<set>中有此属性,其中在<many-to-one>和<one-to-one>中默认值为auto,在<set>中默认值为false。如果为true表示使用迫切左外连接策略。
batch-size:在<class>和<set>中有此属性,默认值为1,设定批量检索的数量。如果设定此项,合理的取值在3~10之间的整数。仅适用于关联级的立即检索和延迟检索。