学习任务

  • 延迟加载
  • Open Session In View模式

延迟加载

延迟加载(lazy load懒加载)是在真正需要数据时才执行SQL语句进行查询,避免了无谓的性能开销。

延迟加载策略的设置分为:类级别的查询策略、一对多和多对多关联的查询策略、多对一关联的查询策略。

Hibernate3.X以上的版本,默认都是采用延迟加载策略。

用于设定延迟加载特性的lazy属性如下表所示:

级别 lazy属性取值
类级别 <class>元素中lazy属性的可选值为true(延迟加载)和false(立即加载)。默认值为true。
一对多关联级别 <set>元素中lazy属性的可选值为true(延迟加载)、extra(增强延迟加载)和fasle(立即加载)。默认值为true。
多对一关联级别 <many-to-one>元素中的lazy属性的可选值为proxy(延迟加载)、no-proxy(无代理延迟加载)和false(立即加载)。默认为proxy。

类级别查询策略

类级别可选策略有:立即加载和延迟加载。默认为延迟加载。

一、立即加载

1.Dept.hbm.xml文件

	<class name="com.etc.entity.Dept" table="`DEPT`" schema="scott"
dynamic-update="true" lazy="false">

  

2.DAO代码

return (Dept) this.getSession().load(Dept.class, id);

  

3.BIZ测试方法

	@Test
public void load() {
Transaction tx=null;
try{
tx=deptDao.getSession().beginTransaction();
Dept dept=deptDao.load(new Short("10"));
tx.commit();
System.out.println(dept.getDeptName());//事务关闭,确认dept属性已全部加载,并输出部门名称
}catch (Exception e) {
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}
}

  

4.测试结果

Hibernate:
select
dept0_."DEPTNO" as DEPTNO1_0_0_,
dept0_."DNAME" as DNAME2_0_0_,
dept0_."LOC" as LOC3_0_0_
from
scott."DEPT" dept0_
where
dept0_."DEPTNO"=?

  

备注:load()方法默认加载OID,不加载实体属性。假如修改class的lazy属性值为true,若要在session关闭后输出实体属性(例外:访问OID不会引发数据库查询,不会报错),将会报如下错误:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

  

此外,无论类级别设置是否为延迟加载,get()和list()方法都是立即加载。

二、延迟加载

1.映射文件延迟加载设置

	<class name="com.etc.entity.Dept" table="`DEPT`" schema="scott"
dynamic-update="true" lazy="true">

  或者:

	<class name="com.etc.entity.Dept" table="`DEPT`" schema="scott"
dynamic-update="true">

  

//待续

一对多和多对多关联查询策略

多对一关联查询策略

Open Session In View

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

  1. hibernate的延迟加载及其与session关闭的矛盾

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不 ...

  2. J2EE进阶(八)Hibernate与延迟加载机制探究

    Hibernate与延迟加载机制探究 前言 Hibernate对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的 ...

  3. 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?

    对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...

  4. 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...

  5. Hibernate的延迟加载

    我们会分析load和get两种加载方式: 一.load加载方式 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load() ...

  6. Hibernate中延迟加载和缓存

    什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问 ...

  7. hibernate的延迟加载和抓取策略

    一,延迟加载 1.实体类延迟加载 通过代理机制完成,由javassist类库实现运行时代理,修改实体类的字节码实现了运行时代理     <class lazy="true|false& ...

  8. 如何理解Hibernate的延迟加载机制?

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载.返回给用户的并不是实体本身,而是实体对象的代理.代理对象在用户调用getter方 ...

  9. 十、hibernate的延迟加载和抓取策略

    延迟加载:控制sql语句发送时机 抓取策略:控制sql语句格式,子查询.连接查询.普通sql 延迟加载 延迟加载(lazy),也叫做懒加载:执行到该行代码时,不发送sql进行查询,只有在真正使用到这个 ...

  10. Hibernate(四)--延迟加载(lazyload)

    hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载 属性的延迟加载: 当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进 ...

随机推荐

  1. 关于spring boot在启动的时候报错: java.lang.Error: generate operation swagger failed, xxx.xxx.xxx

    Error starting ApplicationContext. To display the auto-configuration report re-run your application ...

  2. Drools6:规则互斥

    在Drools中,有的时候会出现一种情况,一个事实Fact,满足了两个规则. 比如Fact的POJO是下面的 public class Message { public static final in ...

  3. HDU 5884 Sort (二分+k叉哈夫曼树)

    题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...

  4. CodeForces 13C【DP】

    题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列: n是5e3,复杂度n^2内.值是1e9: 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[ ...

  5. Unity3D将来时:IL2CPP(上)

    http://inpla.net/thread-8197-1-1.html Unity3D将来时:IL2CPP(上) (注:本文详细的讲述了C#,Mono,.Net, IL等Unity使用到的概念,如 ...

  6. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  7. java 丢失的异常

    采用finally从句中的,可能会丢失异常 package thinking; //: LostMessage.java // How an exception can be lost class V ...

  8. 设置Linux环境变量的方法和区别_Ubuntu/CentOS

    设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...

  9. Backbone.js入门教程第二版笔记(2)

    关于手动触发router,之前看到的例子都是通过在url后面加上#xxx或者点击一个a链接方法来触发, 还有一种情况是通过触发一种规则,来触发另一种规则(表述无能),比如这个例子中,我在url后面加上 ...

  10. (转 )Unity对Lua的编辑器拓展

    转 http://blog.csdn.net/ZhangDi2017/article/details/61203505 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀 ...