引用:https://blog.csdn.net/Vincent_yuan1991/article/details/53482487
一:
lazy,延迟加载
Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。
lazy策略可以用在:

  • 标签上:可以取值true/false
  • 标签上,可以取值true/false,这个特性需要类增强
  • /等集合上,可以取值为true/false/extra
  • /等标签上,可以取值false/proxy/no-proxy
    6.1 get和load的区别:
  • get不支持延迟加载,而load支持。
  • 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。
    6.2 类(Class)的延迟加载:
  • 设置标签中的lazy=“true”,或是保持默认(即不配置lazy属性)
  • 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。
  • //不会发出查询sql
    System.out.println(“group id=” + group.getId());
    这里有一个问题,为什么加载主键的时候不需要发出sql语句。
    6.3 集合(collection)的延迟加载:可以取值true,false,extra
  • 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。
    • 设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。
  • 设置集合上的lazy=false
    true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据
    false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
    extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate
    并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据
    6.4 Hibernate单端关联懒加载策略:即在/标签上可以配置
    懒加载策略。可以取值为:false/proxy/no-proxy
    false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
    proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类
    no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类
    注意:在class标签上配置的lazy属性不会影响到关联对象!!!

二:
a

懒加载可以提高性能吗?
不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能就提高了,其实总体性能不下降就万幸了.

Hibernate的lazy属性可以配置在:

(常用)标签上 ,可以取值true,false,extra
默认为true,当为true时,会懒加载,访问集合属性时再发出SQL语句.但set.size()时,很不智能,不会生成count()语句,而是查出所有记录赋值给set.
extra说明:调用集合的set.size()时,会生成select count(*)from tableName,比较智能.建议使用
(少用)标签上 ,可以取值false,proxy,noproxy
当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.
(不用)标签上 ,可以取值true,false
默认为true,当为false时,load()方法将失去懒加载的特性与get()一样,不影响集合()标签上的lazy特性
(不用)标签上 ,可以取值true,false
默认值为false,懒加载某个字段,无意义,不要使用


get()与load()的区别
get()无懒加载特性,马上执行SQL查询.
load()有懒加载特性,会返加一个代理对象,所以永远不为null,先不执行SQL,要取对象的值时才执行SQL语句,前题session不能关闭,标签上lazy不为false.


实现懒加载的前提: 1 PO不能是final的
2 能实现懒加载的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select

什么时候出遇到懒加载
1 使用load()
2 一对一
查主对象 默认使用join连接,不会发生懒加载
查从对象 默认会发生懒加载,先执行一句select查出从对象,当通过从对象访问了主对象时,再执行一句select查出主对象.

3 多对一
在使用hbm.xnl时,取多的一方时,默认会懒加载,不取一的一方
在使用JPA时,取多的一方时,默认自动使用join on语句取出一的一方(用户与组,用户是多的一方,组是一的一方)

4 一对多()
默认会懒加载,这是必须的,是重常用的。


实现懒加载的方案:

方法一:(没有使用懒加载)
用 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方式,是left outer 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的lazy的使用相关推荐

  1. Hibernate 中lazy的作用

    Hibernate 中lazy的作用 上一篇 / 下一篇  2009-06-24 20:02:20 / 个人分类:java 查看( 506 ) / 评论( 2 ) / 评分( 5 / 0 ) < ...

  2. hibernate中lazy的使用

    lazy,延迟加载 Lazy的有效期:只有在session打开的时候才有效:session关闭后lazy就没效了. lazy策略可以用在: * <class>标签上:可以取值true/fa ...

  3. hibernate延迟加载lazy的原理,以及为什么session关闭会报错

    2019独角兽企业重金招聘Python工程师标准>>> 通过将class的lazy属性设置为true,来开启实体的延迟加载特性. 如果我们运行下面的代码: User user=(Us ...

  4. Hibernate之lazy延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> 一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用sessio ...

  5. java bean lazy proxy_java – Hibernate @Proxy(lazy = false)注释做什么...

    在尝试序列化作为JPA实体的ESRBRating对象时,我遇到了两个不同的堆栈跟踪(见下文).我正在使用Spring Data JPA.控制器调用服务,称为存储库的服务.我能够通过在我的ESRBRat ...

  6. hibernate 全面学习【lazy策略 】

    2019独角兽企业重金招聘Python工程师标准>>> lazy策略可以用在: * <class>标签上:可以取值true/false * <property> ...

  7. hibernate中load和get方法的区别 lazy的策略

    1  get不支持lazy   load支持lazy 2  采用get加载数据时,如果无匹配数据则返回null         load则报异常 --------------------------- ...

  8. hibernate lazy加载

    2019独角兽企业重金招聘Python工程师标准>>> HIBERNATE的持久化对象加载策略. 延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能. Hibernate的l ...

  9. HIbernate Lazy 常用配置

    Lazy:延迟加载,在真正使用某个对象的时候才正真的去创建,即hibernate才会正真的发出sql语句去加载该对象 Lazy的有效期:只有在session打开的时候才有效:session关闭后laz ...

最新文章

  1. 刚刚,蚂蚁金服荣膺“中国金融大数据领军企业”称号
  2. 什么时候z检验什么时候t检验?
  3. API网关-apisix源码剖析,初始化依赖
  4. 一个基于Bmob的OPPO锁屏壁纸小程序,写过之后发现...好像没什么卵用...一脸懵逼
  5. vue内容横向循环滚动_Vue替代marquee标签超出宽度文字横向滚动效果
  6. 下行文格式图片_收藏!公文写作格式大全(附示例图)
  7. python axes函数_matplotlib中的axes.flat做什么?
  8. 安装android开发环境
  9. 数字化定量分析_数字化驱动下的华夏银行信用卡精细化智能服务
  10. [Linux源码分析]内存管理
  11. 遗传算法多维matlab,MATLAB遗传算法
  12. flotherm热仿真,allegro怎么导出flotherm文件
  13. 通过腾讯地图查询经纬度及相关信息
  14. 电脑操作系统(Androidx86、Windows、Linux)说明
  15. 低代码平台开发 python_【低筋面粉】低筋面粉的功效_低筋面粉图片_食材百科_美食杰...
  16. 老男孩读PCIe之一:从PCIe速度说起
  17. 【湍流】基于matlab kolmogorov结合次谐波补偿大气湍流相位屏【含Matlab源码 2178期】
  18. 基于队列数据的RR及其95%CI计算
  19. LevelDB的算分逻辑
  20. 百度回应“搜索引擎百度已死”

热门文章

  1. 简单排序算法(Java实现)
  2. TCP协议——流量控制和拥塞控制
  3. AT2675 [AGC018F] Two Trees(欧拉回路)
  4. cf1523B. Lord of the Values
  5. [NOIP2021] 数列(计数dp)
  6. CF508D Tanya and Password(欧拉回路)
  7. P7962-[NOIP2021]方差【dp,差分】
  8. ZOJ1654-Place the Robots【最大匹配,图论】
  9. ssl1063-统计数字【哈希表】
  10. 【LCT】旅游(P1505)