他们说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版本中运行。
答案 0 :(得分:0)
确保不要跨不同的线程传递数据。如果你使用延迟加载(检查你的hibernate映射默认值),这是特别容易的。
假设一个实体Y是延迟加载的并且是从实体X引用的(通过Hibernate)并且你将X从一个线程传递到另一个线程,而在另一个线程中你执行x.getY(),你就遇到了麻烦。
答案 1 :(得分:0)
找到它。我需要在服务类中声明@Transactional。