产生原因:

当使用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就无法访问,连接不够使用,就会产生“假死”现象。

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. Xcode 性能优化

    参考: 1, 使用Xcode和Instruments调试解决iOS内存泄露 2, iOS系类教程之用instruments来检验你的app 3, iOS性能优化:Instruments使用实战 4,使 ...

  2. UVA 607 二十二 Scheduling Lectures

    Scheduling Lectures Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  3. FreeSWITCH一些需求应对

    一.用户号码组 听到这个名词的时候,心中还挺迷茫,需求如下: 一个用户分配号码为800,但是这个用户有一部座机,两部手机:有人拨打800这个号码时,这个用户的所有关联终端都要振铃. 其实就是用户号码多 ...

  4. .NET在后置代码中输入JS提示语句(背景不会变白)

    来源:http://niunan.iteye.com/blog/248256 Page.ClientScript.RegisterStartupScript(Page.GetType(), " ...

  5. React生命周期浅析

    引言 关于React的生命周期API,官网,有着详细说明.但在实际写代码的过程中,这些说明不能解决所有的疑惑. 所以我列举了一些编码中常见用例,供大家参考. 示例代码如下 /* use case 1. ...

  6. html bootstrap 表头固定在顶部,表列 可以自由滚动的效果

    该效果主要是依照 bootstrap 的一个样式,class="navbar-fixed-top"; 参考网址为:http://v3.bootcss.com/components/ ...

  7. MongoDB入门教程之C#驱动操作实例

    实体类: using MongoDB.Bson; namespace WindowsFormsApp { class User { //public ObjectId _id; //BsonType. ...

  8. KaliLinux装好系统后安装常用软件

    1.配置软件源 leafpad /etc/apt/source.list or(recommand):#官方源deb kali main non-free contribdeb-src kali ma ...

  9. 初识redis——mac下搭建redis环境

    一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...

  10. Java可视化AWT

    AWT 总体上Swing组件替代了绝大部分AWT组件,对AWT图形用户界面编程有极好的补充和加强. package ch11; import java.awt.*; /** * Created by ...