hibernate的懒加载问题

产生原因:

当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常!

解决方案:

方案一:

在Session关闭之前,查询对象关联的集合或者对象,所有在业务层的方法上添加:

 1 public ElecUser findUserByLogonName(String name) {
 2
 3 String condition = " and o.logonName = ?";
 4
 5 Object [] params = {name};
 6
 7 List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, null);
 8
 9 //数据库表中存在该用户,返回ElecUser对象
10
11 ElecUser elecUser = null;
12
13 if(list!=null && list.size()>0){
14
15 elecUser = list.get(0);
16
17 }
18
19 /***
20
21 * 解决懒加载异常
22
23 除了OID之外的其他属性
24
25 */
26
27 elecUser.getElecRoles().size();
28
29 return elecUser;
30
31 }

方案二:在Service层的方法中(Session关闭之前),初始化对象关联的集合或者对象

 1 public ElecUser findUserByLogonName(String name) {
 2
 3 String condition = " and o.logonName = ?";
 4
 5 Object [] params = {name};
 6
 7 List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, null);
 8
 9 //数据库表中存在该用户,返回ElecUser对象
10
11 ElecUser elecUser = null;
12
13 if(list!=null && list.size()>0){
14
15 elecUser = list.get(0);
16
17 }
18
19 /***
20
21 * 解决懒加载异常
22
23 */
24
25 Hibernate.initialize(elecUser.getElecRoles());
26
27 return elecUser;
28
29 }

方案三:在ElecUser.hbm.xml中,添加lazy=”false”,查询用户的同时,立即检索查询用户关联的角色集合:

 1 <set name="elecRoles" table="elec_user_role" inverse="true" lazy="false">
 2
 3 <key>
 4
 5 <column name="userID"></column>
 6
 7 </key>
 8
 9 <many-to-many class="cn.itcast.elec.domain.ElecRole" column="roleID"/>
10
11 </set>

表示查询用户的时候,立即检索用户所关联的角色

建议项目开发中不要在.hbm.xml中添加过多的lazy=false,这样如果表关联比较多,不需要查询的对象也被加载了,性能会出现问题。

方案四:使用spring提供的过滤器OpenSessionInViewFilter,在web容器中添加该过滤器

在web.xml中添加:

要求:该过滤器一定要放置到strtus2的过滤器的前面,先执行该过滤器。

 1 <!-- 添加spring提供的过滤器,解决hibernate的懒加载问题 -->
 2
 3 <filter>
 4
 5 <filter-name>OpenSessionInViewFilter</filter-name>
 6
 7 <filter-class>
 8
 9 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
10
11 </filter-class>
12
13 </filter>
14
15 <filter-mapping>
16
17 <filter-name>OpenSessionInViewFilter</filter-name>
18
19 <url-pattern>*.do</url-pattern>
20
21 <url-pattern>*.jsp</url-pattern>
22
23 </filter-mapping>
24
25 <!-- 配置struts2的过滤器,这是struts2运行的核心 -->
26
27 <filter>
28
29 <filter-name>struts2</filter-name>
30
31     <filter-class>
32
33 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
34
35 </filter-class>
36
37 </filter>
38
39 <filter-mapping>
40
41 <filter-name>struts2</filter-name>
42
43 <url-pattern>*.do</url-pattern>
44
45 <url-pattern>*.jsp</url-pattern>
46
47 </filter-mapping>

OpenSessionInViewFilter过滤器实现的原理:

  1:事务提交:spring提供的声明式事务控制,仍然在业务层的方法进行处理,方法执行完毕后,事务会自动提交,如果出现异常,事务就会回滚。但是它延迟了Session关闭的时间。

  2Session关闭:Session在页面上进行关闭,此时当页面上的数据加载完成之后,再关闭Session

问题:

  如果你开发的系统对页面数据加载比较大的时候,不适合使用OpenSessionInViewFilter,这样Session不能及时关闭,另一个Session就无法访问,连接不够使用,就会产生“假死”现象。

时间: 2024-10-12 14:38:49

hibernate的懒加载问题的相关文章

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

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

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的懒加载

一.lazy概述 在ORM中,当应用程序需要对关联关系的实体进行查询时,hibernate提供了一种查询加载方案--Lazy:延迟加载.当我们通过一个实体可以查询到引用的关联实体时,并不是马上就读取这个实体或者集合,而是在真正调用的时候才会发出查询语句,进行读取,这样可以提高系统的性能. lazy策略使用范围: <class>标签上:可以取值true/false. <property>标签上,属性延迟加载,可以取值true/false,这个特性需要类增强.对属性或返回单值的关联而言

过滤器解决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