产生原因:

当使用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. 在centos6.3用yum安装redis

    一.centos默认的安装源在官方centos.org上,而redis在第三方的yum源里,所以无法安装,非官方的yum推荐用fedora的epel仓库.当然也可通过配置 /etc/yum.repos ...

  2. ruby学习总结01

    1.ruby的两种运行方式:ruby方式咋(在命令行中输入ruby xxx.rb)和irb方式(在命令行中输入 irb) 注意:可以在命令后添加 -E UTF-8 指定编码格式 例:ruby -E U ...

  3. centos 扩展root根分区的大小

    目标:将VolGroup-lv_home缩小到125G,并将剩余的空间添加给VolGroup-lv_root 1.首先查看磁盘使用情况[root@localhost ~]# df -h文件系统     ...

  4. SpringMVC 模拟登陆

    新建BackgroundController类: package cn.bdqn.mvc.controller; import org.springframework.stereotype.Contr ...

  5. 第五章 consul key/value

    1.key/value作用 动态修改配置文件 支持服务协同 建立leader选举 提供服务发现 集成健康检查 2.使用 2.1.查看全部key/value 说明: 使用?recurse参数来指定查看多 ...

  6. CSS深入研究:display的恐怖故事解密(2) - table-cell(转)

    http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html 上集<CSS深入研究:display的恐怖故事解密(1) - ...

  7. 关于Docker在测试方面的应用

    Docker 火了很长一段时间了,前段时间简单的学习和试玩了一下子,发现他对测试很有价值,觉得有必要再次深入研究. 这里标记一些较好的学习网址,用作参考: InfoQ上面有系列的文章: 深入浅出Doc ...

  8. yii2-datepicker/datetimepicker插件使用

    datepicker: https://github.com/2amigos/yii2-date-picker-widget 通过composer安装: composer require 2amigo ...

  9. read 隐藏用户输入

    有时会需要脚本用户进行输入,但不希望输入的数据显示在监视器上,典型的例子就是输入密码,当然还有很多其它类型的数据需要隐藏.-s选项就能够使read命令中输入的数据不现实在监视器上(实际上,数据是显示的 ...

  10. Java中String,StringBuffer,StringBuilder的区别及其使用

    由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚. String:自JDK1.0开始即有,源码中对String的描述: "Strings are constant; their ...