在开发Struts2.0+hibernate3.2+spring2.5项目过程当中,遇到了failed to lazily initialize a collection of role: XXXXXX, no session or session was closed 这个异常的麻烦,起初到网上找资料,获得了下面的一些解决方法:web
一、是把对应一对多的那两个列lazy=true改成lazy=false便可;spring
二、对于查询中若是用的是xxx.load(class,id)则改成xxx,get(class,id);数据库
三、在web.xml文件中加入: 网络
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>session
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>app
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>框架
<!--这个-- <init-param>必定要加否则极可能会报错: org.springframework.dao.InvalidDataAccessApiUsageException:Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
-->
</filter>post
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.mmg</url-pattern>
</filter-mapping>性能
对以上方法进行一一测试,到后来结果都是同样,出现一样的异常,后来有苦苦在网上找资料,并本身努力思考,后来也了解到spring能很好地解决这个问题, Spring 框架为 Hibernate 延迟加载与 DAO 模式的整合提供了一种方便的解决方法。对那些不熟悉 Spring与 Hibernate 集成使用的人,我不会在这里讨论过多的细节,可是我建议你去了解 Hibernate 与 Spring 集成的数据访问。以一个Web 应用为例, Spring 提供了 OpenSessionInViewFilter 和 OpenSessionInViewInterceptor 。咱们能够随意选择一个类来实现相同的功能。两种方法惟一的不一样就在于 interceptor 在 Spring 容器中运行并被配置在 web 应用的上下文中,而 Filter 在 Spring以前运行并被配置在 web.xml 中。无论用哪一个,他们都在请求将当前会话与当前(数据库)线程绑定时打开 Hibernate 会话。一旦已绑定到线程,这个打开了的 Hibernate 会话能够在 DAO 实现类中透明地使用。这个会话会为延迟加载数据库中值对象的视图保持打开状态。一旦这个逻辑视图完成了, Hibernate 会话会在 Filter 的 doFilter 方法或者 Interceptor 的 postHandle 方法中被关闭。用spring解决这个问题 并且不用把lazy设置为false,提升性能。测试
方法是:在web.xml中加入如下配置:
<filter>
<filter-name>hibernateFilter</filter -name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
开始时,把这个配置随意地加到web.xml的最后,发现仍是不行,后来又经过网络了解到是过滤器顺序的问题,应该是:
OpenSessionInViewFilter
ActionContextCleanUp
FilterDispatcher
的顺序,最后调整过滤器的顺序,一些问题解决。
注意:有些时候会出现一些页面或者一些其余的action过滤不到,能够修改以下:
<url-pattern>/*</url-pattern>