延迟加载

在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条数也不会触发加载进内存,因为它只是返回有几个这样的对象,并没有进行属性上的调用;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值