SSH+DWR异常org.hibernate.LazyInitializationException: could not initialize proxy

在SSH+DWR的环境中页面回掉DWR配置的方法,报异常org.hibernate.LazyInitializationException : could not initialize proxy - no Session。在网上查了很久,发现的解决方法都不是很好(大家可以自己搜搜)。

    终于在http://www.javaeye.com/topic/41318  发 现了下面的留言:“主要问题是open session in view的问题,用dwr请求返回的时候并没有session打开在表现层(因为打开session的filter并没有被调用,这是使用 xmlhttprequest导致的),所以要不你就用设置fetchmode来一次性把需要的UserPowerTeamModel拿出来,要不就把 lazy设置成false(但是不推荐这样做,因为改hbm配置文件会影响全局),还有就是写hsql,用left join fetch来得到UserPowerTeamModel ”

    发现这个人前面的分析应该是问题的本质,但是后面给出的办法并不可取。不就是dwr是通过xmlHttprequest访问没有打开 session吗,我们有没有办法让它访问的时候打开session呢。hibernate打开session是在web.xml里面配置的。我的 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>true</param-value>
      </init-param>
     </filter>
     <filter-mapping>
      <filter-name>hibernateFilter</filter-name>
      <url-pattern>*.action</url-pattern>
     </filter-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <servlet-class>
       org.directwebremoting.spring.DwrSpringServlet
      </servlet-class>
      <init-param>
       <param-name>debug</param-name>
       <param-value>true</param-value>
      </init-param>
     </servlet>
     <servlet-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
     </servlet-mapping>
 

然后我添加了如下的一个filter-mapping就ok了。

        <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>/dwr/*</url-pattern>
        </filter-mapping>
 

道理很简单,原来只有< url-pattern > *.action </ url-pattern >的url才会打开hibernate的session,现在我再加上< url-pattern > /dwr/* </ url-pattern >的url,这样dwr回掉的时候也会打开hibernate的session了,问题都解决了,呵呵。

 

希望对也碰到这个问题的朋友能有所帮助

转http://blog.csdn.net/dust_bug/article/details/3163987

猜你喜欢

转载自zhanjianhua.iteye.com/blog/1683346