Hibernate懒加载深入分析

懒加载可以提高性能吗? 

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

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

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

---------------------------------------------------------- 
实现懒加载的前提:1 PO不能是final的 
2 能实现懒加载的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的 
3 须要asm,cglib两个jar包 
4 相应的lazy属性为true 
5 相应的fetch属性为select 
---------------------------------------------------------- 
什么时候出遇到懒加载 
1 使用load() 
2 一对一<one-to-one> 
查主对象 默认使用join连接,不会发生懒加载 
查从对象 默认会发生懒加载,先执行一句select查出从对象,当通过从对象访问了主对象时,再执行一句select查出主对象. 

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

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

---------------------------------------------------------- 
实现懒加载的方案: 


方法一:(没有使用懒加载)   
用 Hibernate.initialize(de.getEmps()) 提前加载一下. 

方法二: 
把与Session脱离的对象重新绑定 
lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。 
Java代码   收藏代码
  1. //直接重新关联  
  2. session.lock(fritz, LockMode.NONE);  
  3. //进行版本检查后关联  
  4. session.lock(izi, LockMode.READ);  
  5. //使用SELECT ... FOR UPDATE进行版本检查后关联  
  6. session.lock(pk, LockMode.UPGRADE);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值