J'ai une application Web avec Spring mis en place pour créer mon usine de session (singleton) hibernate et la session et la transaction (les deux sont portée par la demande), mais il détruit la session et transaction dans le mauvais ordre. Comment puis-je le configurer pour que la transaction soit détruite avant la session? Voici mon fichier applicationContext.xml printemps:Essayer de détruire les haricots dans le bon ordre avec le printemps
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="hibernateSessionFactory" scope="singleton"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<!-- The per-http request hibernate session -->
<bean id="hibernateSession" factory-bean="hibernateSessionFactory"
factory-method="openSession" destroy-method="close" scope="request" />
<!-- The per-http request transaction (i need this to be destroyed BEFORE the session) -->
<bean id="hibernateTransaction" factory-bean="hibernateSession"
factory-method="beginTransaction" destroy-method="commit" scope="request" />
</beans>
Et voici le journal qui le montre la fermeture de la session avant qu'elle ne ferme la transaction:
16111 [http-8080-3] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'close' on bean with name 'hibernateSession'
16111 [http-8080-3] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
16111 [http-8080-3] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 4, unused: 3, excluded: 0] (e.g. [email protected])
16111 [http-8080-3] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'commit' on bean with name 'hibernateTransaction'
16111 [http-8080-3] DEBUG org.hibernate.transaction.JDBCTransaction - commit
16111 [http-8080-3] WARN org.springframework.beans.factory.support.DisposableBeanAdapter - Invocation of destroy method 'commit' failed on bean with name 'hibernateTransaction'
org.hibernate.SessionException: Session is closed
Salut, Je pensais que le printemps avait des options intégrées pour gérer la session/txn, mais après avoir lu ces deux liens, je ne suis toujours pas près de comprendre comment ils fonctionneraient. Je pense que je vais opter pour votre option «classe d'aide», c'est une excellente idée. Je pense qu'il est dommage que le printemps ne puisse pas contrôler l'ordre de destruction, il ne fait vraiment pas grand-chose pour moi. – Chris
J'ai regardé ces 2 liens, et je ne peux pas voir comment je pourrais utiliser le gestionnaire de transaction de printemps (ou autre chose) pour me donner une session et une transaction que je pourrais injecter dans mes actions, cela semblait seulement me donner une session Je pourrais alors appeler 'getCurrentSession()', ce qui ne me semble pas très bien. – Chris
Je suppose que ce que je demande est, si ce n'est pas la meilleure façon, quelle est la meilleure façon de gérer les sessions/txns avec le printemps? – Chris