Hibernate懒加载解析

在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。

我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。

实现懒加载的前提:

1 实体类不能是final的

2 能实现懒加载的对象都是被CGLIB(反射调用)改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select 
下面几种可以实现懒加载功能:

1、   通过Session.load()实现懒加载

load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。

用load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。

使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);

使用load()可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。

2、   one-to-one(元素)实现了懒加载。

在一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。

需要把主对象配制成lazy="true" constrained="true"  fetch="select"。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。

一对一的时候,查询从对象的是默认是懒加载。即:查询从对象的时候不会把主对象查询出来。而是查询出来的是主对象的代理对象。

3、   many-to-one(元素)实现了懒加载。

多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。

多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。

hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".具体设置成什么要看你的需求,并不是说哪个设置就是最好的。在<many-to-one>与<one-to-one>标签上:当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.

lazy= 什么时候捉取

fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高)

fetch=join时,lazy的设置将没有意义.

4、   one-to-many(元素)懒加载:默认会懒加载,这是必须的,是重常用的。

一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。

一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。

需要配置主对象中的set集合lazy="false" 这样就配置成是不懒加载了。或者配置抓取方式fetch="join"也可以变成不懒加载。

实现懒加载的方案:

方法一:(没有使用懒加载)

用 Hibernate.initialize(de.getEmps()) 提前加载一下. 
方法二:

把与Session脱离的对象重新绑定

lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。

//直接重新关联

session.lock(fritz,LockMode.NONE);

//进行版本检查后关联

session.lock(izi,LockMode.READ);

//使用SELECT... FOR UPDATE进行版本检查后关联

session.lock(pk,LockMode.UPGRADE);

方法三:

OpenSessionInView

参见 http://www.javaeye.com/topic/32001

fetch 和 lazy 配置用于数据的查询

lazy 参数值常见有 false 和 true,Hibernate3映射文件中默认lazy = true ;

fetch 指定了关联对象抓取的方式,参数值常见是select和join,默认是select,select方式先查询主对象,再根据关联外键,每一个对象发一个select查询,获取关联的对象,形成了n+1次查询;而join方式,是leftouter join查询,主对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

在映射文件中,不同的组合会使用不同的查询:

1、lazy="true" fetch = "select" ,使用延迟策略,开始只查询出主对象,关联对象不会查询,只有当用到的时候才会发出sql语句去查询 ;

2、lazy="false" fetch = "select" ,没有用延迟策略,同时查询出主对象和关联对象,产生1+n条sql.

3、lazy="true"或lazy="false"fetch = "join",延迟都不会作用,因为采用的是外连接查询,同时把主对象和关联对象都查询出来了.

另 外,在hql查询中,配置文件中设置的join方式是不起作用的,而在其他查询方式如get、criteria等是有效的,使用 select方式;除非在hql中指定join fetch某个关联对象。fetch策略用于get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

Hibernate懒加载解析相关推荐

  1. (10) Hibernate懒加载详解

    懒加载为hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种 ...

  2. Hibernate懒加载问题

    刚开始接触这种数据持久化框架时,使用的是Maybatis,相较于最原始的JDBC+SQL模式,Maybatis简直就是神器,特别是在用过Maybatis动态SQL后,简直就开始对Maybatis爱不释 ...

  3. Hibernate懒加载问题的5种解决方案

    ** 1.Hibernate基础 ** Hibernate基础,传送门 ** 2.什么是Hibernate懒加载 ** 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用 ...

  4. hibernate 懒加载_Hibernate懒/急加载示例

    hibernate 懒加载 这篇文章将重点讨论为什么以及如何在应用程序中使用称为LAZY和EAGER加载的概念,以及如何使用Spring的Hibernate模板以EAGER方式加载LAZY实体. 当然 ...

  5. Hibernate懒加载

    在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而 ...

  6. 什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?

    所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...

  7. 简单理解hibernate懒加载

    遇到问题代码 @GetMapping("/{id}")public Coffee getById(@PathVariable Long id) {Coffee coffee = c ...

  8. JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

    什么是懒加载 JPA是java持久层的API,也就是java官方提供的一个ORM框架,Spring data jpa是spring基于hibernate开发的一个JPA框架.Spring data j ...

  9. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

最新文章

  1. thinkpad重装系统不引导_重装系统时,如何判断Windows的启动方式是Legacy还是UEFI?...
  2. 【python】Python遍历dict的key最高效的方法是什么?
  3. Spring Cloud依赖
  4. Linux环境下Git的安装以及使用
  5. Idea 中使用Lombok 编译报找不到符号
  6. 关于更换PC版浏览器推荐
  7. 【Ansible】非完全离线安装Ansible和Ansible-tower
  8. Google 搜索服务退出中国
  9. 摄氏度与华氏度之间的转换
  10. word文档docx转为pdf文件,在Linux操作系统上也能正常显示中文
  11. java经典算法50题_JAVA经典算法50题
  12. php更改文件为只读,word只读模式怎么修改
  13. 2009个人年度总结报告
  14. Chaya虚拟机学习 —— 启用Docker遇到的Bug
  15. C语言中数值后面跟字母解析
  16. matlab奇异矩阵高效求逆,奇异矩阵求逆问题!!!
  17. 【iS-RPA 前瞻系列四】- 机器人共享
  18. 贪心算法_排队不等式_绝对值不等式_推公式
  19. 最新PHP开源采集器/蓝天采集器系统源码
  20. you have not installed the Java Cryptography Extension (JCE)

热门文章

  1. IDEA常用快捷键!!
  2. datatable报错 uncaught TypeError: Cannot read property 'aDataSort' of undefined
  3. HTML和CSS基础知识
  4. java 基础(匿名内部类)
  5. DW php创建站点
  6. Android自动化测试之路——Provider(一)
  7. 2015微信商业化正式启幕 为企业开启O2O主阵地
  8. [实变函数]4.4 依测度收敛
  9. Asp.net Ajax框架教程
  10. 线程访问临界区的问题 实例,需解决