JAVA项目开发笔记(9):hibernate 的 session问题

  关于hibernate的经典异常

 

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:    no session or session was closed

 

网上找了下,解决方法大概有三种

 

 

OpenSessionInViewFilter

HibernateInterceptor

OpenSessionInViewInterceptor

 

但这三种方法我都不能用下面说下大概的原因

 

1.OpenSessionInViewFilter

 

这个配到web.xml中就可以了,用法如下

 

原理是在每次webRepuest请求时建立一个hibernate的session

 

以前用的是这个方法,也成功解决过一次这个问题,但在我做新功能时又出现上面那个异常

一开始我分析这个问题是这样的:

 

      我在项目中使用的richface也就是ajax4jsf 那么就是说,a4j所产生的并不是webRequest请求而是xmlRequest请求,也就是说不会创建一个hibernate的session那么就会出现我一开始的那个错误.

后来经测试发现不是,无论是webRequest请求还是xmlReques请求都一样会被这个过滤器发现,我是这样测的,

重写的spring的OpenSessionInViewFilter

 

用日志输出来看了一下.发现无论是什么请求都会发生一次getSession和closeSession方法,

 

分析这个错误的原因是,因为每次请求都要getSession和closeSession而我的backBean是session范围的,所以这次请求同上次请求使用的是不同的hibernate的session,而延迟加载要求使用同一个session,而那个session在下次请求时已经被close了并同时创建了一个新的session所以出现以上错误!

 

2.HibernateInterceptor

 

这个是业务层上的,要配到spring的xml中去,用法如下

 

或者

 

 

原理是使用的spring的代理(面向方面),在你使用spring的sessionBean的方法时spring会为你创建hibernate的 session.

可是问题又来了.

我的要求延迟加载的方法不在spring的sessionBean中,而是在jsf的backingBean中,也就是就hibernate的session还是不会被调用

 

3.OpenSessionInViewInterceptor

 

这个同第一个差不多,但是不同的是第一个是响映webrequest而这个是url,而ajax的响映是不会改变url的,所以这个也不行

 

用法如下(抄来的)

 

所以说这三个方法在我这里都行不通.继续找解决办法.唉,有知道的朋友请指点一下我吧

 

另外查到一遍文章,这位朋友的问题和我一样,不过他使用的ajax框架是dwr,他提供了一个解决办法

http://blog.csdn.net/dust_bug/archive/2008/10/28/3163987.aspx

他修改了OpenSessionInViewFilter的过滤方法为

 

说这样 dwr回掉的时候也会打开hibernate的session了

 

可是我以前试过把这个过滤改为*也没好使,不知道我的是否可以参考一下这个解决方法

 

 

参考文章

 

http://mayabin.javaeye.com/blog/111266

 

http://bbs.zbaccp.com/redirect.php?tid=3805&goto=lastpost

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值