Tengo una aplicación web con Spring configurada para crear mi fábrica de sesiones de hibernación (singleton) y sesión y transacción (ambas tienen alcance de solicitud), pero está destruyendo la sesión y transacción en el orden incorrecto. ¿Cómo puedo configurarlo para que la transacción se destruya antes de la sesión? Aquí está mi archivo applicationContext.xml primavera:Intentando destruir frijoles en el orden correcto 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>
Y aquí está el registro que muestra que el cierre de la sesión antes de que cierre la transacción:
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
Hola, Tenía la sospecha de que la primavera tenía opciones integradas para administrar la sesión/txn, sin embargo, después de leer esos dos enlaces, todavía no estoy más cerca de entender cómo funcionarían. Creo que iré por su opción 'clase de ayuda', esa es una gran idea. Creo que es una lástima que la primavera no pueda controlar el orden de destrucción, realmente no está haciendo demasiado por mí. – Chris
Miré esos 2 enlaces, y no puedo ver cómo podría usar el administrador de transacciones de primavera (o cualquier otra cosa) para darme una sesión y transacción que pudiera inyectar en mis acciones, solo parecía darme una sesión de fábrica que podría llamar a 'getCurrentSession()', que a mí no se ve bien. – Chris
Supongo que lo que estoy preguntando es, si esta no es la mejor manera, ¿cuál es * la mejor manera de administrar sesiones/txns con la primavera? – Chris