failed to lazily initialize a collection of role:..no session or session was clo

在开发Struts2.0+hibernate3.2+spring2.5项目过程中,遇到了failed to lazily initialize a collection of role: XXXXXX, no session or session was closed 这个异常的麻烦,起初到网上找资料,得到了下面的一些解决方法:

1、是把对应一对多的那两个列lazy=true改为lazy=false即可;

2、对于查询中如果用的是xxx.load(class,id)则改为xxx,get(class,id);

3、在web.xml文件中加入: 

<filter>
      <filter-name>hibernateFilter</filter-name>
      <filter-class>

          org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>

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

     <filter-mapping>
         <filter-name>hibernateFilter</filter-name>
         <url-pattern>*.mmg</url-pattern>
     </filter-mapping>

 

对以上方法进行一一测试,到后来结果都是一样,出现同样的异常,后来有苦苦在网上找资料,并自己努力思考,后来也了解到spring能很好地解决这个问题Spring框架为Hibernate延迟加载与DAO模式的整合提供了一种方便的解决方法。对那些不熟悉SpringHibernate集成使用的人,我不会在这里讨论过多的细节,但是我建议你去了解HibernateSpring集成的数据访问。以一个Web应用为例,Spring提供了OpenSessionInViewFilterOpenSessionInViewInterceptor。我们可以随意选择一个类来实现相同的功能。两种方法唯一的不同就在于interceptorSpring容器中运行并被配置在web应用的上下文中,而FilterSpring之前运行并被配置在web.xml中。不管用哪个,他们都在请求将当前会话与当前(数据库)线程绑定时打开Hibernate会话。一旦已绑定到线程,这个打开了的Hibernate会话可以在DAO实现类中透明地使用。这个会话会为延迟加载数据库中值对象的视图保持打开状态。一旦这个逻辑视图完成了,Hibernate会话会在FilterdoFilter方法或者InterceptorpostHandle方法中被关闭。用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>

你可能感兴趣的:(DAO,spring,Hibernate,Web,网络应用)