Hibernate检索策略

万星明 2013-06-24

Hibernate检索策略

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  感谢!

 

相关推荐