延迟加载--懒加载
一、 延迟加载的概念
延迟加载(lazy load),也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。
Hibernate中主要是通过代理(proxy)机制来实现延迟加载。
具体过程:Hibernate从数据库获取某个对象数据时、获取某个对象的集合属性时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标示符以外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建代理对象来表示对象,这个对象的所有属性都是默认值;只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载数据。
Hibernate中默认采用延迟加载的三种情况:
1、 当调用Session上的load()方法加载一个实体时,会采用懒加载。
2、 当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。
3、 当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。
二、关闭懒加载
延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载,如果Hibernate先默认使用懒加载,而后又必须去数据库加载,反而会降低效率。所以要根据应用程序的实际情况来灵活控制是否使用延迟加载。
Hibernate中需要修改相应配置来启用或关闭延迟加载功能:
1、 在加载单个实体对象,如果不需要延迟加载,就可以使用Session的get()方法。
2、 当Session加载某个实体时,不需要对这个实体中集合属性值延迟加载,而是要立即加载,这是可以在映射文件中针对这个集合的配置元素(<set>、<bag>、<list>、<map>…)添加属性lazy=flase.
3、 当Session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在映射文件中针对这个单端关联的配置元素(<one-to-one>从对象查主对象、<one-to-many>一查多)添加属性lazy=false。
三、 大对象的延迟加载
由于Hibernate针对实体类的普通属性(除标示符、集合属性和单向关联属性)默认采取立即加载,但是实体的某个属性类型为大对象(CLOB、BLOB),可能经常需要对这个属性进行延迟加载,此时可以在映射文件中针对这个属性的配置元素上添加属性lazy=true;
示例:
<property name=”content” type=”clob” lazy=”true”>
<colum name=”content” sql-type=”longtext”/>
</property>
另外,还需要使用类增强器对二进制Class文件进行强化处理,Hibernate3针对应用程序所使用的动态代理类库(cglib或javassist)提供对应的增强工具库,可以借助ANT来定义一个任务对需要进行强化处理的字节码进行强化处理。