他们说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时出现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版本中运行。

有帮助吗?

解决方案

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top