在hibernate中,关于延迟加载配置
什么是延迟加载,以QX和jd表为例,假如不延迟加载,假如我们查询一个qx对象数据,那么该对象的数据中有一条为set的jd对象集合;那么就会把该set中的所有jd对象加载到内存,假如jd有关联了其它的表,又会把其它表页同步加载,这样不仅可能浪费内存,增加查询的时间,假如关联表过多,可能查询出的数据会是电脑内存崩溃!
延迟加载顾名思义就是不让一些属性在我们查询该对象的时候就立即加载到内存,而是根据加载等级来决定加载时间;
延迟模式
一般可以分为三种模式:
完全不延迟:所有的属性都加在进来,造成内存溢出,时间缓慢;
完全延迟:除了大容量的笨大属性,其它的普通name,id等属性也不实时加载进内存,
部分延迟:一般的属性实时加载,包含多对象的属性延迟加载;
延迟等级
除了加载的三种模式,延迟加载还有三种等级:
这三种等级在主表《set》中设置和在从表对象属性《pojo》中设置也有不同
在set中:示例代码
第一种lazy=true是默认的等级,当获得该对象之后再获取对象属性,就加载该对象session.get(Student.class,1).getScore()
<set name="emps" inverse="true" cascade="all" lazy="true">
<key>
<column name="DEPTNO" precision="2" scale="0" />
</key>
<one-to-many class="com.bdqn.entitydao.Emp" />
</set>
第二种lazy=false是不延迟等级,默认加载该对象时就加载该对象session.get(Student.class,1)
<set name="emps" inverse="true" cascade="all" lazy="false">
<key>
<column name="DEPTNO" precision="2" scale="0" />
</key>
<one-to-many class="com.bdqn.entitydao.Emp" />
</set>
第三种lazy=extra是最强延迟加载,只有当使用这个对象的具体属性时才进行加载session.get(Student.class,1).getScore().getcore;
<set name="emps" inverse="true" cascade="all" lazy="extra">
<key>
<column name="DEPTNO" precision="2" scale="0" />
</key>
<one-to-many class="com.bdqn.entitydao.Emp" />
</set>
在对象属性中配置:
第一种是lazy=“false”不延迟加载
<many-to-one name="dept" class="com.bdqn.entitydao.Dept" fetch="select" lazy="false">
<column name="DEPTNO" precision="2" scale="0" />
</many-to-one>
第二种是lazy=“no-proxy”不代理,最强延迟加载,指的是内存不代理,所以等级最高只有当使用该对象的属性的时候才进行加载
<many-to-one name="dept" class="com.bdqn.entitydao.Dept" fetch="select" lazy="no-proxy">
<column name="DEPTNO" precision="2" scale="0" />
</many-to-one>
第三种是lazy=“proxy”代理比默认的等级,当获取该对象时就加载如内存
<many-to-one name="dept" class="com.bdqn.entitydao.Dept" fetch="select" lazy="proxy">
<column name="DEPTNO" precision="2" scale="0" />
</many-to-one>
在上面的几种方法中获取size条数的方法,只要等级达到最高延迟加载,即使代用getsession在get条数也不会触发加载进内存,因为它只是返回有几个这样的对象,并没有进行属性上的调用;