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的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
随机推荐
- web时代变迁及html5与4的区别
HTML5的新结构标签 在之前的HTML页面中,大家基本上都是用了Div+CSS的布局方式.而搜索引擎去抓取页面的内容的时候,它只能猜测 你的某个Div内的内容是文章内容容器,或者是导航模块的容器,或 ...
- SAP学习日志--RFC REMOTE FUNCTION CALL
RFC Remote function Call 远程功能调用, 是SAP系统之间以及非SAP系统之间程序通信的基本接口技术. 例如BAPI , ALE都是基于RFC实现的 SAP系统提供了三种外部 ...
- DevExpress VCL 13.1.4支持Delphi /C++Builder XE5
DevExpress VCL 13.1.4支持Delphi /C++Builder XE5 重大变化 ExpressLibrary dxHalfOfPi常数声明已经从cxGeometry单元移到了cx ...
- iOS端项目注释规范附统一代码块
代码的注释经常被人忽略,以至于在后期维护的时候较为困难.我们准备在XX项目开始之前制定一套规范的注释体系,致力于达到就算维护人员改变也能快速上手的效果. 1.属性注释 属性注释 使用 /** 注释*/ ...
- UITableViewController和延时执行、自定义控件
1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...
- 【代码笔记】iOS-评分,支持我们
一,效果图. 二,工程图. 三,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additi ...
- iOS-H5学习篇-02
H5-自学笔记-2016年09月06日 一:各种标签的练习 Html和CSS的关系 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言. 1.1.1. HTML是网页内容的 ...
- YUM源的简介,配置与使用
A.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...
- php示例代码之empty函数
1 2 3 4 5 6 7 8 9 10 11 <?php $testVar=0; if(empty($testVar)) { echo 'msg:true'; } ...
- DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS
今天在测试.验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为 ...