关于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