hibernate的懒加载

一、lazy概述

在ORM中,当应用程序需要对关联关系的实体进行查询时,hibernate提供了一种查询加载方案——Lazy:延迟加载。当我们通过一个实体可以查询到引用的关联实体时,并不是马上就读取这个实体或者集合,而是在真正调用的时候才会发出查询语句,进行读取,这样可以提高系统的性能。

lazy策略使用范围:

<class>标签上:可以取值true/false。

<property>标签上,属性延迟加载,可以取值true/false,这个特性需要类增强。对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取。需要编译期字节码强化,因此这一方法很少是必要的。

<set>/<list>等集合上,可以取值为true/false/extra。延迟集合抓取,对集合而言这是默认行为。

<one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy

二、使用

1、Class的lazy:可以取值true/false

设置<class>标签中的lazy="true",或是保持默认(默认为true)。

那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。

2、collection的Lazy:可以取值true,false,extra

设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据。

false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据。

extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。

三、Lazy的有效期

Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。

例如如下访问就会出现问题:

可以看到在session关闭之后,再访问user.getName().就会报错,可以看一下访问的过程:

那有没有解决的方法的呢?答案是必须的,那就是使用threadlocal。我这里只提供方法,具体实现就不一一到来了。

四、load/get方法

1、查找时,都会优先从session的缓存中查找。

2、Load返回的是代理对象,等到真正要用到对象的内容时才发起SQL语句.get直接发起SQL语句从数据库中取出,所以,get不支持延迟加载,而load支持。

3、当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。

这就是关于lazy的一些相关知识,lazy只是hibernate抓取策略中的一种,hibernate的四大原生抓取策略在下篇博客中介绍。

时间: 2024-10-12 18:03:50

hibernate的懒加载的相关文章

hibernate中懒加载和及加载的区别

在hibernate中懒加载会去缓存中找,如果要找的是某一个对象不会出问题,如果是要找某一个对象包含的对象会报session关闭异常,应为我们在缓存中查找了对象过后session就关闭了,如果非要这样的话在实现类里面就可不能关闭session.然而及时加载就不会出现这些问题,及时加载时直接去数据库中查找出所有内容,不用担心会出现session异常关闭的问题.但是懒加载速度比及加载更快.

hibernate的懒加载问题

产生原因: 当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常! 解决方案: 方案一: 在Session关闭之前,查询对象关联的集合或者对象,所有在业务层的方法上添加: 1 public ElecUser findUserByLogonName(String name) { 2 3 String condition = " and o.logonName = ?"; 4 5 Object [] params = {

Hibernate的懒加载session丢失解决方法

在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class&

hibernate中懒加载急加载的区别,get方法和load方的区别法

懒加载是hibernate中的关联关系对象的默认方式,懒加载也会先去查询对象然后获取对象的id, 当正真要对数据进行使用时才会正真写sql语句. 懒加载的有效加载期是在session打开的时候,所以在我们要使用到懒加载的时候必须要保持session的开启. 急加载就是直接用sql语句去访问数据库,但速度相对于懒加载更快. get()方法在执行时会立刻向数据库发出sql语句. load()方法和懒加载类似也是只有当真正使用该实体的属性时才会发出sql语句: 还有就是当数据库中查询不到东西时,方法会

hibernate中懒加载和急加载的区别,以及hibernate中get()方法和load()方法的区别

* 懒加载在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存.而急加载在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询. 急加载就会很快,因为在第一次加载的时候,已经帮我们全部加载好了.而懒加载则会相对慢一些,因为在我门需要查询的时候,它才会执行sql操作. 所以懒加载的优点是占用内存小,执行速度慢;急加载是执行速度快,占用内存高 hibernate的get()he load()方法在执行的时候又很大的区别, 执行get()方法会把所有的基本数据全部加载, 而

hibernate 设置懒加载自动为字段添加属性

hibernate错误:org.apache.struts2.json.JSONWriter can not access a member of class org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper with modifiers "public" 解释是当action执行完,return success返回xml文件后,前提是你设置了懒加载之后,hibernate自动为你懒加载的实

过滤器解决hibernate中懒加载问题

使用过滤器解决懒加载问题需要我们对过滤器的生命周期有深刻的理解 1.浏览器发送一个请求 2.请求通过过滤器执行dofilter之前的代码 3.浏览器通过过滤器到达Servlet(注意我们这里的servlet指的是Servlet和其他组件比如jsp) 4.请求在servlet中得到处理,并且得到展示(将数据发到jsp中) 5.依次从后往前执行过滤器中的dofilter之后的代码. 6.将数据返回到用户的浏览器上 我们可以通过在过滤器中拿到Session在jsp页面获得数据之后关闭Session 即

Hibernate懒加载异常的解决与深刻分析

出现原因: Hibernate允许对关联对象及属性延迟加载,前提是这个操作在同一个Hibernate session范围内进行.如果发生这样的情况,当service层返回了一个启用延迟加载功能的domain对象给web层,而web层访问到这些需要延迟加载的对象或属性时,由于加载domain对象的session已经关闭导致无法访问,就会出现访问异常. 解决方法: 我们可以使用一个过滤器,在web请求时给它绑定一个Hibernatesession,这样就可以保证整个请求的过程中session都是开启

(11)Hibernate懒加载

1.get.load方法区别? get: 及时加载,只要调用get方法立刻向数据库查询 load:默认使用懒加载,当用到数据的时候才向数据库查询. 2.懒加载(lazy) 2.1.概念 概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性. 目的:提升程序执行效率! 2.2.lazy属性的值 在Hibernate中,懒加载对应lazy属性的值. lazy属性的值 序号 值 含义 1 true 使用懒加载 2 false 关闭懒加载 3 extra 在集合属性(配置当中使用s