收藏 分销(赏)

Hibernate懒加载深入分析.docx

上传人:pc****0 文档编号:9008868 上传时间:2025-03-11 格式:DOCX 页数:4 大小:18.11KB 下载积分:10 金币
下载 相关 举报
Hibernate懒加载深入分析.docx_第1页
第1页 / 共4页
Hibernate懒加载深入分析.docx_第2页
第2页 / 共4页


点击查看更多>>
资源描述
  Hibernate懒加载深入分析 2011-04-29 19:42 94人阅读 评论(0) 收藏 举报 ---------------------------------------------------------- 懒加载可以提高性能吗?  不可以简单的说"能",因为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 参见                               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中无效。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服