转 : 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的方法。
- //直接重新关联<br>
- <br>
- session.lock(fritz, LockMode.NONE);<br>
- <br>
- //进行版本检查后关联<br>
- <br>
- session.lock(izi, LockMode.READ);<br>
- <br>
- //使用SELECT ... FOR UPDATE进行版本检查后关联<br>
- <br>
- session.lock(pk, LockMode.UPGRADE);<br>
- <br>
————————————————————————————————————————————————————————————————————
方法三:
OpenSessionInView
http://www.iteye.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懒加载深入分析的更多相关文章
- Hibernate懒加载深入分析
Hibernate懒加载深入分析 懒加载可以提高性能吗? 不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...
- hibernate懒加载(转载)
http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...
- 关于s2sh框架关于hibernate懒加载问题的说明和解决方案
首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被 ...
- Hibernate懒加载的三种解决方案
Hibernate懒加载的两种解决方案: 1.Hibernate.initialize(代理对象) 2.在*.hbm.xml映射文件中添加lazy="false"属性 3.使用op ...
- Hibernate懒加载解析
Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...
- hibernate懒加载
Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...
- 关于Hibernate懒加载问题的最终解决方案
看到一篇Hibernate懒加载的文章,所以转载,原地址如下: http://tuoxie007.iteye.com/blog/334853 Hibernate的强大之处之一是懒加载功能,可以有效的降 ...
- 【转】hibernate懒加载的问题,failed to lazily initialize a collection of role
hibernate懒加载的问题,failed to lazily initialize a collection of role hibernate懒加载的问题,failed to lazily in ...
- -java转json hibernate懒加载造成的无限递归问题
1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...
随机推荐
- MySQL为什么需要一个主键
主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...
- TortoiseSVN客户端重新设置用户名和密码
TortoiseSVN客户端重新设置用户名和密码 在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么 ...
- js 为字符串添加样式
<html><body> <script type="text/javascript"> var txt="Hello World!& ...
- LINUX安全加固规范
1 概述 近几年来Internet变得更加不安全了.网络的通信量日益加大,越来越多的重要交易正在通过网络完成,与此同时数据被损坏.截取和修改的风险也在增加. 只要有值得偷窃的东西就会有想办法窃取它的人 ...
- C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。
作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1) 输入10个无序的整数.(2) 用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3) 要求任意输入一个整数 ...
- asp.net天网代码
自己整理的asp.net中国天气网的城市代码 完整下载 case "北京": Code = "101010100"; break; case "海淀& ...
- Cocos2d-x 核心概念 - 层(Layer)
层(Layer) 一个简单的主界面是由是三个层叠加实现的,从上到下依次为,菜单层,精灵层,背景层 这个次序适用与事件的响应机制,菜单层最先接受到系统事件,然后精灵层,最后背景层 在事件传递的过程中,如 ...
- [bzoj3192][JLOI2013]删除物品(树状数组)
3192: [JLOI2013]删除物品 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 872 Solved: 508[Submit][Status ...
- 转载分享----一线交付眼中的为何"项目总是迟迟无法交付”
当初博主在一线交付BOSS系统中承担过TC角色 交付的路途很艰辛,加班到10点多或1点多第二天8点上班,还有通宵的日子 还有无数个问题从开始到关闭的周期,各种催人,各种掐架拉会,各种被甲方嫌弃 看到这 ...
- c++第一天
今天完成的事情: [主线] 1.熟悉cpp文件的编译运行 2.初步认识输入输出 值得关注的地方是: 流的概念.endl除了结束当前行外,还有刷新缓冲区的功能.以及对 输入输出运算符(<< ...