java - manejo - transacciones hibernate
¿Cómo configurar la gestión de transacciones para trabajar con 2 db diferentes en Spring? (4)
Tengo 2 bases de datos (MySql y HSQLDB). Configuré 2 fuentes de datos y 2 beans EntityManagerFactory. También puedo configurar 2 beans corresponsales JpaTransactionManager.
Pero no sé cómo especificar cuál de ellos debería usarse para administrar las transacciones para una clase de servicio concreta. Quiero utilizar la anotación @Transactional
para ese propósito, pero en realidad solo puedo especificar uno de los txManagers:
<tx:annotation-driven transaction-manager="manager"/>
¿Cuál es la salida de esta situación?
Dado que es después de un largo tiempo desde las respuestas correctas.
Skaffman puede ser correcto en términos de usabilidad de JpaTransactionManager para múltiples bases de datos.
Pero existe una solución de trabajo para usar 2 bases de datos diferentes con 2 JpaTransactionManager diferentes.
@Bean(name = "db2TransactionManager")
public PlatformTransactionManager transactionManager2() throws NamingException {
JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
return txManager;
}
@Bean
@Primary
public PlatformTransactionManager transactionManager() throws Exception {
JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
txManager.setNestedTransactionAllowed(true);
return txManager;
}
@Primary
debe usar para especificar para aquellos en los que no se especifica el nombre del calificador en @Transactional
Debe especificar dos gestores de transacciones para eso en application-context.xml de la siguiente manera:
<tx:annotation-driven transaction-manager="manager1"/>
<tx:annotation-driven transaction-manager="manager2"/>
El atributo @Transactional ahora usará su administrador de transacciones relevante.
Declare su atributo <tx:annotation-driven>
sin transaction-manager , declare los calificadores para los gerentes de transacción de la siguiente manera:
<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<qualifier value="txManager1"/>
</bean>
Utilice este calificador en @Transactional como valor para seleccionar uno de los gerentes de transacción:
@Transactional("txManager1")
o, con más propiedades:
@Transactional(value = "txManager1", readOnly = true)
El javadoc para JpaTransactionManager tiene algunos consejos sobre esto:
Este administrador de transacciones es apropiado para aplicaciones que usan una única JPA EntityManagerFactory para el acceso a datos transaccionales. JTA (generalmente a través de JtaTransactionManager) es necesario para acceder a múltiples recursos transaccionales dentro de la misma transacción. Tenga en cuenta que debe configurar su proveedor de JPA en consecuencia para que participe en las transacciones de JTA.
En otras palabras, si se encuentra con múltiples administradores de entidades, con los gerentes de tx correspondientes, entonces debería considerar usar un solo JtaTransactionManager
en JtaTransactionManager
lugar. Los gerentes de la entidad deberían poder participar en las transacciones de JTA, y esto le dará total transaccionalidad entre los dos gerentes de la entidad, sin tener que preocuparse por en qué administrador de entidades se encuentra en un momento dado.
Por supuesto, JtaTransactionManager
requiere un servidor de aplicaciones compatible con JTA completo, en lugar de un motor de servlets estándar como Tomcat.