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的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
随机推荐
- 记STM32F030多通道ADC DMA读取乱序问题
问题描述通过 uint16_t ConvData[8]保存DMA搬运的ADC转换数值,但是这个数组数值的顺序总是和ADC不是顺序对应的.比如用7个通道的ADC,当设置ADC_InitStructure ...
- Atitit。Web server Jetty9 使用 attilax 总结
Atitit.Web server Jetty9 使用 attilax 总结 1.1. 静态文件的资源1 1.2. Servlet使用1 1.3. code1 1.1. 静态文件的资源 WebAppC ...
- linux集群运维工具:pssh
由于需要安装hadoop集群,有10台机器需要安装,一开始打算用SCP复制,后来觉得不可接受(实际现场可能数倍的机器集群,就是10台也不想干).后来在网上找了,发现了clustershell和pssh ...
- .frame类库简单介绍与使用
.a静态库是Unix推出的,几乎所有平台都可以使用: .framework是Apple推出的,是对.a静态库的封装,方便使用. 1.新建framework类库项目 2.生成的类库中,自定义的源头文件需 ...
- 限制EditText 输入的字节数
1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...
- android MediaPlayer API大全已经方法详解(转载)
通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...
- 【代码笔记】iOS-两个滚动条,上下都能滑动
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- 第二个activity
Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个Activity 创建第2个Activity的过程 1. 创建c ...
- 学习Coding-iOS开源项目日志(一)
前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了 ...
- AngularJS 指令
AngularJS 指令 AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. ng-app 指令 ng-app 指令定义了 AngularJS 应用程序的 根元素. ng-app 指 ...