[size=small]
----------------------------------------------------------
懒加载可以提高性能吗?
不可以简单的说"能",因为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的方法。
//直接重新关联
session.lock(fritz, LockMode.NONE);
//进行版本检查后关联
session.lock(izi, LockMode.READ);
//使用SELECT ... FOR UPDATE进行版本检查后关联
session.lock(pk, LockMode.UPGRADE);
方法三:
OpenSessionInView
参见
http://www.iteye.com/topic/32001
未完,待续
[/size]
分享到:
相关推荐
深入理解hibernate懒加载技术,正确使用懒加载
hibernate懒加载策略.dochibernate懒加载策略.doc
hibernate抓取策略和懒加载案例,供大家下载查看。大家都知道,hibernate都设计到一个优化问题。
去除预加载的Viewpager,加载第一页时不会默认加载第二页,
主要介绍了浅谈解决Hibernate懒加载的4种方式,具有一定借鉴价值,需要的朋友可以参考下。
解决org.hibernate.LazyInitializationException: could not initialize proxy - no Session...
Hibernate延迟加载以及利用Spring 大家看看 参考一下
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
hibernate延迟加载解决 延迟加载的具体解决方法
hibernate结构框架及组要实现类的深入分析 用来改造hiberna,实现sdo das
自己研究的hibernate加载方式和多态加载的分析. 写的不好,不过可以供深入者确切体会hibernate的种种功能的本质
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
Hibernate延迟加载机制.zip
Hibernate延迟加载Hibernate延迟加载
深入浅出 Hibernate.pdf
Hibernate延迟加载介绍.doc
Hibernate 延迟加载
Hibernate缓存深入详解