DWR / OpenSessionInView“会话已关闭!”在Java和Hibernate中

时间:2009-11-27 06:53:10

标签: java hibernate spring dwr

他们说hibernate和带有ajax的webapp的封闭会话是java和spring的常见问题所以我必须像这样在web.xml中设置OpenSessionInViewInFilter

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>    
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>
<filter>
    <filter-name>springFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>springFilter</filter-name>
    <url-pattern>/dwr/*</url-pattern>
</filter-mapping>

但即便如此,当我尝试使用Hibernate Criteria api时,我得到了“Session is Closed”的hibernate异常,所以我尝试了另一种使用OpenSessioninViewInterceptor的弹簧方式

<bean id="urlMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="false"/>
     <property name="mappings">
            <props>
                <prop key="*">dwrController</prop>
            </props>
    </property>
    <property name="interceptors">

           

和拦截器

<bean id="openSessionInViewInterceptor"class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">

               

相同“会话已关闭”问题。请帮帮我。我是Java的新手,所以非常感谢你的帮助。

我目前正在maven的jetty插件6.1.10版本中运行。

2 个答案:

答案 0 :(得分:0)

确保不要跨不同的线程传递数据。如果你使用延迟加载(检查你的hibernate映射默认值),这是特别容易的。

假设一个实体Y是延迟加载的并且是从实体X引用的(通过Hibernate)并且你将X从一个线程传递到另一个线程,而在另一个线程中你执行x.getY(),你就遇到了麻烦。

答案 1 :(得分:0)

找到它。我需要在服务类中声明@Transactional。