tutorial mvc framework español ejemplos edicion cuarta books arquitectura accion java spring jpa spring-transactions transactionmanager

java - mvc - Spring-¿Es posible usar múltiples gestores de transacciones en la misma aplicación?



spring java tutorial (2)

Cuando utiliza una anotación @Transactional , puede especificar el administrador de transacciones para usar agregando un conjunto de atributos a un nombre o calificador de bean. Por ejemplo, si el contexto de su aplicación define múltiples gestores de transacciones con calificadores:

<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory1" /> <qualifier value="account"/> </bean> <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory2" /> <qualifier value="businessData"/> </bean>

Puede usar el calificador para especificar el administrador de transacciones para usar:

public class TransactionalService { @Transactional("account") public void setSomethingInAccount() { ... } @Transactional("businessData") public void doSomethingInBusinessData() { ... } }

Soy nuevo en Spring y me pregunto si es posible usar numerosos gestores de transacciones en la misma aplicación.

Tengo dos capas de acceso a datos, una para ambas bases de datos. Me pregunto, ¿cómo hace para usar un administrador de transacciones para una capa y un administrador de transacciones diferente para la otra capa? No necesito realizar transacciones en ambas bases de datos, todavía. Pero sí necesito realizar transacciones en cada base de datos individualmente. Creé una imagen para ayudar a delinear mi problema:

Aquí está mi configuración de contexto de la aplicación:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:component-scan base-package="cheetah.repositories" /> <tx:annotation-driven /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="accounts" /> </bean> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> </beans>

Aquí hay un ejemplo que usa esta configuración:

@Repository public class JpaAccountRepository implements AccountRepository { @PersistenceContext(unitName = "cheetahAccounts") private EntityManager accountManager; @Override @Transactional public Account findById(long id) { Account account = accountManager.find(Account.class, id); return account; } }

Entonces, para el repositorio de cuentas, quiero usar una fábrica de administrador de entidades con la unidad de persistencia establecida en cuentas. Sin embargo, con mi Repositorio BusinessData, quiero usar una fábrica de administrador de entidades con una unidad de persistencia diferente. Como solo puedo definir un administrador de transacciones Bean, ¿cómo puedo utilizar diferentes administradores de transacciones para los diferentes repositorios?

Gracias por cualquier ayuda.


Esta entrada de Spring Jira discute el problema un poco:

https://jira.spring.io/browse/SPR-3955

Creo que podría ser un administrador de transacciones por conexión si no está utilizando la confirmación en dos fases. Solo necesita crear dos gestores de transacciones e inyectarlos con la conexión adecuada.

Pero debo hacer la pregunta: ¿por qué crees que necesitas dos gerentes de transacción? Puede tener más de una conexión de base de datos. Los DAO que usan las conexiones pueden y deben ser instanciados por diferentes servicios, cada uno de los cuales puede ser anotado con sus propias configuraciones transaccionales. Un gerente puede acomodar ambos. ¿Por qué crees que necesitas dos?