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时,运行结果如下

时间: 2024-12-18 17:21:54

Hibernate延迟加载Lazy的相关文章

Hibernate 延迟加载

一.延迟加载定义 延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即当只有真正使用该对象的数据时才会创建.说白了,所谓的延迟加载不是在load的时候去数据库加载数据,而是当我在应用程序中真正使用该数据时Hibernate才去查询.加载相应的数据. 二.延迟加载实现原理 Hibernate中主要是通过代理(proxy)机制来实现延迟加载,即Hibernate丛数据库获取某一个对象数据时.获取某一 个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使

【转】hibernate 延迟加载

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的"秘密". 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将

hibernate延迟加载(懒加载)详解

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的"秘密". 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时, 完成所有集合属性的抓取,

Hibernate延迟加载机制详解

摘自 http://blog.chinaunix.net/uid-20577907-id-3129234.html 1 延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作. 在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载.下面我们就分别介绍这些种类的延迟加载的细节. A.实体对象的延迟加载: 如果想对实体对象使用延迟加载,必须要在实体的映射配置文

JavaWeb系列——Hibernate——延迟加载(转)

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的"秘密". 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将

Hibernate延迟加载

参考:http://blog.csdn.net/s_good/article/details/7411642 1.关于lazy机制: 延迟初始化错误是运用Hibernate开发项目时最常见的错误.如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它.如果在游离状态时才初始化它,就会产生延迟初始化错误. 下面把Customer.hbm.xml文件的<class>元素的lazy属性设为true,表示使用延迟检索策略: &

hibernate 延迟加载 (复制--&lt;徒步成长 --记录我的点滴&gt;)

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的“秘密”. 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将导致性能急

Hibernate延迟加载机制原理

一.什么是懒加载?他的作用? 延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建. Hibernate中主要是通过代理(proxy)机制来实现延迟加载.它的具体过程:Hibernate丛数据库获取某一个对象数据时.获取某一 个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不是数据库加载真正的数据,而只是为该对 象创建一个代理对象来代表这个对象,这个对象上的所有属性都是默认值

SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】

配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-c