万星明 2013-06-24
Hibernate的检索策略分三种:
<!--[if !supportLists]-->一、 <!--[endif]-->立即检索 fetch=”select”
就是在检索数据时立即返回实际需要的数据,在hibernate中处于性能的考虑默认不使用立即检索,只有当映射文件中指定lazy=”false”时才使用立即检索策略。如:
<set name=”orders” lazy=”false”/>
<!--[if !supportLists]-->二、 <!--[endif]-->延迟加载
就是在检索数据时并不会返回实际的数据,只是返回一个代理对象,在真正使用这些数据时才从数据库中加载。配置:lazy=”true”时才进行延迟加载,在hibernate中默认都使用延迟加载。Fetch!=”join”
<!--[if !supportLists]-->三、 <!--[endif]-->预先抓取
和立即加载一样都是在检索数据时立即返回实际需要的数据,它以外连接的形式查询数据库,配置:fetch=”join”时预先加载
在hibernate3中类和集合的lazy属性值默认为true(延迟加载)
多对一
在hibernate中默认的检索方式:延迟加载,抓取方式为select
对于多对一和一对一的关联关系,应该优先考虑使用预先抓取的策略,它比立即检索使用的select语句少,可以提高性能(但也要视具体情况而定)
例:order对象和member对象(多对一关联)
Order.hbm.xml的<many-to-one>节点的fetch属性 | Order.hbm.xml的<many-to-one>节点的lazy属性 | Member.hbm.xml的<class>节点的lazy属性 | 检索策略 |
/ | False | / | 立即检索 |
/ | Proxy | True | 延迟加载 |
Join | / | False | 预先抓取 |
无 | 无 | False | 预先抓取 |
Select | / | False | 立即检索 |
“/”表示任意
一对一
在一对一的关联中使用哪种检索策略都可以,
主对象默认使用的预先加载
从对象默认使用的预先加载
例:member对象和idcard对象(一对一关联)
Member.hbm.xml的<one-to-one>节点的fetch属性 | Member.hbm.xml的<one-to-one>节点的constrained属性 | IDCard.hbm.xml的<class>节点的lazy属性 | 检索策略 |
/ | True | 无 | 延迟加载 |
Join | False | / | 预先加载 |
无 | 无 | 无 | 预先加载 |
Select | / | / | 立即检索 |
一对一关联中的延迟加载:
要设置<one-to-one>节点的constrained属性值为”true”,且必须设置关联端的<class>节点的lazy属性值为true,因为constrained=”false”时表明实体与被关联的实体的约束不是强制的,既存在一个Member对象时,关联的IdCard对象可能存在也可能不存在,所以在查询Member对象时,hibernate会先查询一次所关联的实体是否存在,而这时关联的实体已经查询出来。所以要进行延迟加载必须设置constrained=”true”.
在<one-to-one>、<many-to-one>的一对一关联中,主对象(<one-to-one>)的从对象默认进行延迟加载
多对多/一对多
在一对多或多对多关联中应该首先考虑使用延迟加载
在一对多关联中默认的使用延迟加载、抓取方式为select
多对一关联中set属性的设置:
Fetch属性 | Lazy属性 | 检索策略 |
Join | / | 预先抓取 |
Select | False | 立即检索 |
Select | True | 延迟加载 |
转自http://wenku.baidu.com/view/0050ffef81c758f5f61f678e.html 感谢!