Ho un'app Web con Spring set up per creare la mia factory di sessione di sospensione (singleton) e sessione e transazione (entrambi sono scope scope), ma sta distruggendo la sessione e transazione nell'ordine sbagliato. Come posso configurarlo in modo che la transazione venga distrutta prima della sessione? Ecco la mia primavera del file applicationContext.xml:Cercando di distruggere i bean nell'ordine corretto con Spring
<?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>
Ed ecco il log che mostra la chiusura della sessione prima di chiudere la transazione:
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
Ciao, Avevo il sospetto che la primavera avesse opzioni integrate per la gestione della sessione/txn, tuttavia dopo aver letto quei due collegamenti non sono ancora più vicino a capire come funzionerebbero. Penso che andrò per la tua opzione 'helper class', è una grande idea. Penso che sia un peccato che la primavera non possa controllare l'ordine di distruggere, in realtà non sta facendo molto per me. – Chris
Ho guardato quei 2 link e non riesco a vedere come potrei usare il gestore delle transazioni di primavera (o qualsiasi altra cosa) per darmi una sessione e una transazione che potrei iniettare nelle mie azioni, sembrava solo darmi una sessione fabbrica che potrei quindi chiamare 'getCurrentSession()', che per me non sembra carino. – Chris
Credo che quello che sto chiedendo sia, se questo non è il modo migliore, quale * è * il modo migliore per gestire sessioni/txns con la primavera? – Chris