Hibernate延迟加载Lazy

延迟加载(lazy load)又称为懒加载,延迟加载的机制是为了避免一些无谓性能的开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

如何配置延时加载呢?

在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不同的,下面我们来分别介绍

一.Class标签中的lazy

我们可以看到class标签中的lazy有两个取值,分别为true和false,当lazy值为默认值true时,它是延迟加载的,当lazy值为false时,是立即加载的

我们来做例子实验一下

/*
 * 部门实体类
 */
public class Dept {
    //不问标号
    private Integer deptNo;
    private String deptName;
    //关联一个员工集合
    private Set<Emp> sets=new HashSet<Emp>();
    public Set<Emp> getSets() {
        return sets;
    }
    public void setSets(Set<Emp> sets) {
        this.sets = sets;
    }
    public Integer getDeptNo() {
        return deptNo;
    }
    public void setDeptNo(Integer deptNo) {
        this.deptNo = deptNo;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

}
<!--Dept.hbm.xml--><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.a.entity">
    <class name="Dept" table="Dept" lazy="true">
    <id name="deptNo">
        <generator class="sequence">
        <param name="sequence">SEQ_Student</param>
        </generator>
    </id>
    <property name="deptName"></property>
    <set name="sets" cascade="save-update">
    <key column="deptNo"></key>        <!-- 多的一方的外建 -->
    <one-to-many class="Emp" />
    </set>
    </class>
</hibernate-mapping>
                                                                                                           
//测试端代码
@Test
    public void toTest()
    {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Dept dept=(Dept)session.load(Dept.class, 1);
        System.out.println(dept.getDeptNo());
        System.out.println("================================");

        tx.commit();
        HibernateUtil.CloseSession();
    }

这里注意,session.get()的方法不支持延时加载他会忽略掉类级别的lazy属性,当lazy为true的时候运行结果如下所示

那么,把lazy改为false时,其他代码都不变,运行结果如下所示

我们可以看到两种取值的区别,当lazy属性值为true时Hibernate并不会一次性加载出所有属性值,只有当程序需要时才去加载从而减少了和数据库交互的负担,提升了程序的性能,这也是延迟加载出现的目的!

二.Set元素中的lazy属性

如果对象中存在其他实体的集合则需要在hbm文件中配置set元素来进行表间的映射,而在set元素中也可以添加lazy强延时加载。

set元素中lazy有三个值,false(非延时加载),true(延时加载),extra(加强延时加载)

同样我们用上面的例子做测试

/*
 * 部门实体类
 */
public class Dept {
    //不问标号
    private Integer deptNo;
    private String deptName;
    //关联一个员工集合
    private Set<Emp> sets=new HashSet<Emp>();
    public Set<Emp> getSets() {
        return sets;
    }
    public void setSets(Set<Emp> sets) {
        this.sets = sets;
    }
    public Integer getDeptNo() {
        return deptNo;
    }
    public void setDeptNo(Integer deptNo) {
        this.deptNo = deptNo;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.a.entity">
    <class name="Dept" table="Dept">
    <id name="deptNo">
        <generator class="sequence">
        <param name="sequence">SEQ_Student</param>
        </generator>
    </id>
    <property name="deptName"></property>
    <set name="sets" cascade="save-update" lazy="true">
    <key column="deptNo"></key>        <!-- 多的一方的外建 -->
    <one-to-many class="Emp" />
    </set>
    </class>
</hibernate-mapping>
                                                                                                           

这里我们只比较true和extra的区别

@Test
    public void toTest()
    {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Dept dept=(Dept)session.load(Dept.class, 1);
        System.out.println(dept.getSets().size());
        System.out.println("================================");
        for (Emp item : dept.getSets()) {
            System.out.println(item.getEmpName());
        }
        tx.commit();
        HibernateUtil.CloseSession();
    }

当lazy为true时,运行结果如下

当lazy为extra时,运行结果如下

Hibernate延迟加载Lazy的更多相关文章

  1. [转]Hibernate延迟加载与opensessioninviewFilter

    原文地址:http://blog.csdn.net/a19881029/article/details/7916702 hibernate延迟加载: 一个person对应多个school,使用hibe ...

  2. Hibernate学习--hibernate延迟加载原理(动态代理)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  3. 【转】hibernate 延迟加载

    Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiberna ...

  4. hibernate 延迟加载深入分析(persistentSet的延迟加载)

    Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiberna ...

  5. Hibernate 延迟加载 分析

    出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...

  6. Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  7. Hibernate延迟加载与opensessioninviewFilter

    转自:https://blog.csdn.net/skk_7/article/details/17917339 hibernate延迟加载: 一个person对应多个school,使用hibernat ...

  8. hibernate中lazy的使用

    lazy,延迟加载 Lazy的有效期:只有在session打开的时候才有效:session关闭后lazy就没效了. lazy策略可以用在: * <class>标签上:可以取值true/fa ...

  9. Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式

    Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...

随机推荐

  1. Sass的使用和基础语法

    sass安装 官网下载ruby的windows安装包,安装时勾选上添加到环境变量add ruby executables to your path.安装完成后打开命令行,ruby -v输出内容则安装完 ...

  2. MSCRM 报表显示 rsprocessingaborted 错误

    今天又有朋友遇到rsprocessingaborted这个问题,想想这个已经是很老很老的问题了,得在写一遍补充下. 一.首先会考虑是不是SrsDataConnector没有安装的原因,如果正常安装的话 ...

  3. 系统补丁对sharepoint很重要

    系统补丁对sharepoint很重要,会提高sharepoint运行效率,加载速度明显变快.

  4. XMPP学习——1、介绍

    XMPP(Extensible Messaging and Presence Protocol,前称Jabber[1])是一种以XML为基础的开放式实时通信协议,是经由互联网工程工作小组(IETF)通 ...

  5. Swift-Switch穿透

    switch vegetable {        case "celery":            print("Add some raisins and make ...

  6. OC NSArray 数组

    # OC NSArray 数组 NSArray常用方法 获取数组中第一位元素 array.firstObject 获取数组中最后一个元素 array.lastObject 获取数组中指定索引下标的元素 ...

  7. 学习Coding-iOS开源项目日志(一)

    前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了 ...

  8. net2.0对于递归变量的处理方式不同引发的递归问题

    同样的代码,用NET2.0执行产生的效果与其它框架使用的不同,导致报错. 认真查找原因后发现该程序的编写人员隐式的使用了一个公共变量,使之在递归过程中不断的被改写,使得1次递归后就破坏了原来的循环体, ...

  9. AOP的实现机制

    1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...

  10. [转]android笔记--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启 ...