产生原因:

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

解决方案:

方案一:

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

 public ElecUser findUserByLogonName(String name) {

 String condition = " and o.logonName = ?";

 Object [] params = {name};

 List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, null);

 //数据库表中存在该用户,返回ElecUser对象

 ElecUser elecUser = null;

 if(list!=null && list.size()>0){

 elecUser = list.get(0);

 }

 /***

 * 解决懒加载异常

 除了OID之外的其他属性

 */

 elecUser.getElecRoles().size();

 return elecUser;

 }

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

 public ElecUser findUserByLogonName(String name) {

 String condition = " and o.logonName = ?";

 Object [] params = {name};

 List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, null);

 //数据库表中存在该用户,返回ElecUser对象

 ElecUser elecUser = null;

 if(list!=null && list.size()>0){

 elecUser = list.get(0);

 }

 /***

 * 解决懒加载异常

 */

 Hibernate.initialize(elecUser.getElecRoles());

 return elecUser;

 }

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

 <set name="elecRoles" table="elec_user_role" inverse="true" lazy="false">

 <key>

 <column name="userID"></column>

 </key>

 <many-to-many class="cn.itcast.elec.domain.ElecRole" column="roleID"/>

 </set>

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

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

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

在web.xml中添加:

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

 <!-- 添加spring提供的过滤器,解决hibernate的懒加载问题 -->

 <filter>

 <filter-name>OpenSessionInViewFilter</filter-name>

 <filter-class>

 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

 </filter-class>

 </filter>

 <filter-mapping>

 <filter-name>OpenSessionInViewFilter</filter-name>

 <url-pattern>*.do</url-pattern>

 <url-pattern>*.jsp</url-pattern>

 </filter-mapping>

 <!-- 配置struts2的过滤器,这是struts2运行的核心 -->

 <filter>

 <filter-name>struts2</filter-name>

     <filter-class>

 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

 </filter-class>

 </filter>

 <filter-mapping>

 <filter-name>struts2</filter-name>

 <url-pattern>*.do</url-pattern>

 <url-pattern>*.jsp</url-pattern>

 </filter-mapping>

OpenSessionInViewFilter过滤器实现的原理:

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

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

问题:

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

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

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

    在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <fi ...

  2. hibernate的懒加载

    WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...

  3. hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题

    引用地址 在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") ...

  4. hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败

    在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @Resp ...

  5. Hibernate @OneToOne懒加载实现解决方案

    在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题.虽然给出了解决方法,但并没有给出完整的解决方案.今天我专门针对该问题进行讨论.至于懒加载失效的原因,在之前的文章 ...

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

    使用过滤器解决懒加载问题需要我们对过滤器的生命周期有深刻的理解 1.浏览器发送一个请求 2.请求通过过滤器执行dofilter之前的代码 3.浏览器通过过滤器到达Servlet(注意我们这里的serv ...

  7. hibernate懒加载(转载)

    http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...

  8. Hibernate中的一级缓存、二级缓存和懒加载(转)

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

  9. Hibernate中的一级缓存、二级缓存和懒加载

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

随机推荐

  1. Linux源代码分析工具链

    前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码. 在Windows下有sourceinsight这个源码阅读软件(虽然我没用过, ...

  2. SUSE Linux Enterprise Server 设置IP地址、网关、DNS

    说明: ip:192.168.21.172 子网掩码:255.255.255.0 网关:192.168.21.2 dns:8.8.8.8 8.8.4.4 1.设置ip地址 vi /etc/syscon ...

  3. UE4高级功能--初探超大无缝地图的实现LevelStream

    转自:http://blog.csdn.net/u011707076/article/details/44903223 LevelStream 实现超大无缝地图--官方文档学习 The Level S ...

  4. ICP(迭代最近点)算法

    图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ...

  5. Create XO Checker Game With Oracle Forms

    Created XO Checker game in Oracle Forms and sharing its FMB (source code) for reference so that you ...

  6. 【Asp.Net使用EasyUI】EasyUI combox实现联动

    很多时候都会用到combox的联动效果,选择上一个combox的值就自动带出这个值对应的其它信息,比如省市联动,最近我也刚好遇到了类似的要求,是用EasyUI  combobox 控件完成的,如果是A ...

  7. hdu 0-1背包

    题目地址http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include <stdio.h> #include <string.h> ...

  8. 【CC评网】2013.第39周 漂亮的作息表

    作息表 网上看到一份夏令时的作息表,让人羡慕不已: 5:00 起床——迷糊5分钟,喝500ML白开水,坐马桶看Google reader 5:20 小区6KM(大约25min—30min)+100个俯 ...

  9. [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5999  Solved: 2473[Submit][Stat ...

  10. Expression Blend制作自定义按钮(转)

    来源:http://www.cnblogs.com/iChina/archive/2011/11/25/2262854.html Expression Blend制作自定义按钮 1.从Blend工具箱 ...