DWR / OpenSessionInView «La session est fermée!» En Java et Hibernate
Question
Ils disent qu’une session fermée en hibernate et une application Web avec ajax est un problème courant avec java et spring, je dois donc définir OpenSessionInViewInFilter dans le fichier web.xml comme ceci
<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>
Mais même avec cela, je reçois le "Session is closed". exception hibernate lorsque j'essaie d'utiliser l'API Hibernate Criteria, alors j'ai essayé une autre méthode de printemps en utilisant 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">
et l'intercepteur
<bean id="openSessionInViewInterceptor"class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
Identique "La session est fermée". problème. S'il vous plaît aidez-moi ici. Je suis nouveau en Java, votre aide est donc très appréciée.
Je cours actuellement dans le plugin jetty de maven, version 6.1.10.
La solution
Assurez-vous de ne pas transmettre les données à différents threads. Ceci est particulièrement facile si vous utilisez un chargement différé (vérifiez vos valeurs de mappage de veille prolongée).
Dites si une entité Y est chargée paresseuse et est référencée à partir de l'entité X (via Hibernate) et que vous passez X d'un thread à un autre et que dans ce autre thread, vous faites x.getY (), vous êtes en difficulté.
Autres conseils
Je l'ai trouvé. Je dois déclarer @Transactional dans ma classe de service.