Hibernate延迟加载Lazy
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的更多相关文章
- [转]Hibernate延迟加载与opensessioninviewFilter
原文地址:http://blog.csdn.net/a19881029/article/details/7916702 hibernate延迟加载: 一个person对应多个school,使用hibe ...
- Hibernate学习--hibernate延迟加载原理(动态代理)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- 【转】hibernate 延迟加载
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiberna ...
- hibernate 延迟加载深入分析(persistentSet的延迟加载)
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiberna ...
- Hibernate 延迟加载 分析
出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...
- Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- Hibernate延迟加载与opensessioninviewFilter
转自:https://blog.csdn.net/skk_7/article/details/17917339 hibernate延迟加载: 一个person对应多个school,使用hibernat ...
- hibernate中lazy的使用
lazy,延迟加载 Lazy的有效期:只有在session打开的时候才有效:session关闭后lazy就没效了. lazy策略可以用在: * <class>标签上:可以取值true/fa ...
- Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式
Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
随机推荐
- 总结CSS3新特性(Transform篇)
概述: CSS3新添加的Transform可以改变元素在可视化区域的坐标(这种改变不会引起文档的重排,只有重排),以及形状,还有些3D形变.结合 Animation(这里以后会有个链接的) 能实现酷炫 ...
- 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号
最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Laravel 5 性能优化技巧
说明 性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论. 这里是简单的列表 ...
- 【Android】用MediaRecorder录制视频太短崩的问题
具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...
- OC NSString(字符串)
OC NSString(字符串) 多行文字字面量 NSString * string = @"abC" @"DEF" @"hjk" @&qu ...
- js:插入节点appendChild insertBefore使用方法
首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...
- Vmware快速安装linux虚拟机(SUSE)
安装环境:Vmware 11.SUSE11 64位 vmware快速安装linux虚拟机的过程还是比较简单的,步骤如下: 1.点击文件,新建虚拟机. 2.选择典型安装. 3.在红框中选择想要安装的虚拟 ...
- DATETIME类型和BIGINT 类型互相转换
项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...