failed to lazily initialize a collection of role:

 

failed to lazily initialize a collection of role

在开发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>

相关文章
相关标签/搜索