Hibernate懒加载解析
hibernatejoinsession数据库sqlobject
Hibernate懒加载解析
在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。
我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。
实现懒加载的前提:
1 实体类不能是final的
2 能实现懒加载的对象都是被CGLIB(反射调用)改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select
下面几种可以实现懒加载功能:
1、 通过Session.load()实现懒加载
load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。
用load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。
使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);
使用load()可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。
2、 one-to-one(元素)实现了懒加载。
在一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。
需要把主对象配制成lazy="true" constrained="true" fetch="select"。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。
一对一的时候,查询从对象的是默认是懒加载。即:查询从对象的时候不会把主对象查询出来。而是查询出来的是主对象的代理对象。
3、 many-to-one(元素)实现了懒加载。
多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。
多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。
hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".具体设置成什么要看你的需求,并不是说哪个设置就是最好的。在<many-to-one>与<one-to-one>标签上:当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.
lazy= 什么时候捉取
fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高)
fetch=join时,lazy的设置将没有意义.
4、 one-to-many(元素)懒加载:默认会懒加载,这是必须的,是重常用的。
一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。
一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。
需要配置主对象中的set集合lazy="false" 这样就配置成是不懒加载了。或者配置抓取方式fetch="join"也可以变成不懒加载。
实现懒加载的方案:
方法一:(没有使用懒加载)
用 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方式,是leftouter 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懒加载策略.dochibernate懒加载策略.doc
主要介绍了浅谈解决Hibernate懒加载的4种方式,具有一定借鉴价值,需要的朋友可以参考下。
解决org.hibernate.LazyInitializationException: could not initialize proxy - no Session...
深入理解hibernate懒加载技术,正确使用懒加载
去除预加载的Viewpager,加载第一页时不会默认加载第二页,
hibernate抓取策略和懒加载案例,供大家下载查看。大家都知道,hibernate都设计到一个优化问题。
主要介绍了Hibernate懒加载之标签上的lazy,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
有问题的懒加载,有大神帮忙修改么?
主要介绍了hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法,需要的朋友可以参考下
SSH2 annotation 实现struts2.1.6 spring2.5.6 hibernate3.3 全注解开发 hibernate延迟加载_懒加载 具体应用
hibernate配置连接池大全 hibernate配置连接池大全
本文结合OA项目,介绍ssh框架所遇到的核心问题,包含登录时数据初始化设置,hibernate懒加载处理,structs2对权限的拦截处理,jsp页面传值EL和ONGL表达式的介绍
019 关联映射文件中集合标签中的 lazy(懒加载)属性 020 、单端关联上的 lazy(懒加载)属性 021 继承关联映射 022 component(组件)关联映射 023 复合主键 关联映射 024 其它 关联映射 025 hibernate 悲观锁、乐观锁 ...
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243103
学习成长路,Hibernate总结: 1.Hibernate入门优缺点、 2.Hibernate的操作CRUD、 3.主键生成机制、 ...7.懒加载、 8.Hibernate检索策略(fetch抓取策略)、 9.二级缓存、 10.Hbernate的检索方式(HQL语句)
hibernate实体有三个状态 1、瞬时状态 对象由new操作符创建,尚未与Session关联的对象被认为处于瞬态.瞬态对象不会持久化到数据库中,也不会被赋予持久化标识.而这个时候只在内存中存在,与数据库无关 2、持久状态 ...
基于 hibernate3.3+spring3.0+struts2 搭建好的框架,数据库 事物 已经配好,懒加载 也配好了
Hibernate作为最流行的ORM工具也同样使用CGLIB库来代理单端关联(集合懒加载除外,它使用另外一种机制)。EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类...