Hibernate 懒加载解决方案

使用Hibernate 都会遇到这样一个问题就是,懒加载。

问题描述:

当session关闭的时候,即系统在业务层方法调用完毕的时候,例如:只查询的User的对象,而没有将ElecUser(用户)对象关联的ElecRole(权限)查询出来,此时再session关闭之后,再次调用集合方法的时候,就会产生懒加载异常,产生懒加载异常的条件,与查询对象关联的对象没有查询,也就是没有产生sql语句。

解决方案:

方案一:在业务层Session关闭之前,调用与对象关联的对象的除了id之外的其他属性,就可以查询出所关联的对象。

代码:在Service层修改:
ElecUser elecUser = null;
if(list!=null && list.size()>0) {
elecUser = list.get(0);
elecUser.getElecRoles().size();
}


方案二:在业务层Session关闭之前,使用Hibernate.initialize
//由于登录名对应唯一的对象
ElecUser elecUser = null;
if(list!=null && list.size()>0) {
elecUser = list.get(0);
Hibernate.initialize(elecUser.getElecRoles());
}


方案三:查询用户的同时,同时将用户关联的角色集合查询出来,修改ElecUser.hbm.xml文件中的set元素的lazy属性即可
<set name="elecRoles" table="elec_user_role" lazy="false">
<key>
<column name="userID"></column>
</key>
<many-to-many class="cn.itcast.elec.domain.ElecRole" column="roleID"/>
</set>
缺点:不管是否用到角色,都会查询出来,影响性能。


方案四:在web容器中添加过滤器(spring整合hibernate提供的)OpenSessionInViewFilter,作用使用延迟的Session的关闭时间,在返回的页面之前调用关联的属性都可以,该过滤器一定要添加到struts2过滤器的前面。

缺点:如果项目在页面一端压力很大,显示页面的时候查询数据较多,不建议使用OpenSessionInViewFilter。会存在连接不够用,在页面端压力很大。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值