manager - Spring Transactions y hibernate.current_session_context_class
spring jpa transaction (1)
Cuando utilice transacciones administradas de Spring y Spring, nunca intente con la propiedad hibernate.current_session_context_class
MENOS que esté usando JTA.
Por defecto, Spring establecerá su propia implementación SpringSessionContext ( SpringSessionContext ), sin embargo, si la configura usted mismo, este no será el caso. Básicamente rompiendo la correcta integración de transacciones.
La única razón para cambiar esta configuración es cuando quiera usar transacciones administradas de JTA, luego debe configurar esto para integrarse adecuadamente con JTA.
Tengo una aplicación Spring 3.2 que utiliza Hibernate 4 y Spring Transactions. Todos los métodos funcionaban muy bien y pude acceder correctamente a la base de datos para guardar o recuperar entidades. Luego, introduje algunos subprocesos múltiples y, como cada subproceso estaba accediendo a db, recibía el siguiente error de Hibernate:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
Leí en la web que tengo que agregar <prop key="hibernate.current_session_context_class">thread</prop>
a mi configuración de Hibernate, pero ahora cada vez que intento acceder a la base de datos obtengo:
org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction
Sin embargo, mis métodos de servicio están anotados con @Transactional
, y todo funcionaba bien antes de agregar <prop key="hibernate.current_session_context_class">thread</prop>
.
¿Por qué no hay transacciones aunque los métodos están anotados con @Transactional? ¿Como puedó resolver esté problema?
Aquí está mi configuración de Hibernate (incluyendo la propiedad de contexto de sesión):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- Hibernate session factory -->
<bean
id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
<property name="dataSource" >
<ref bean="dataSource" />
</property>
<property name="hibernateProperties" >
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
</property>
<property name="annotatedClasses" >
<list>
...
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>