Pregunta

Soy nuevo en primavera y me pregunto si es posible utilizar numerosos gestores de transacciones en la misma aplicación?

Tengo dos capas de acceso a los datos - una para dos bases de datos. Me pregunto, ¿cómo ir sobre el uso de los administradores de una transacción para una capa diferente y administrador de transacciones para la otra capa. No necesito para realizar transacciones a través de ambas bases de datos - todavía. Pero lo que sí es necesario realizar transacciones en cada base de datos de forma individual. He creado una imagen para una ayuda sucinta mi problema:

text alt

Aquí está mi configuración de contexto de 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>

Este es un ejemplo que utiliza 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;
    }
}

Así que para el depósito de cuentas, quiero usar una fábrica gestor de la entidad con la unidad de persistencia conjunto de cuentas. Sin embargo, con mi BusinessData repositorio, quiero usar una fábrica gestor de la entidad con una unidad de persistencia diferente. Dado que sólo puedo definir frijol gerente de una transacción, ¿cómo puedo ir sobre el uso de diferentes gestores de transacciones para los diferentes repositorios?

Gracias por cualquier ayuda.

¿Fue útil?

Solución

Cuando se utiliza una anotación @Transactional, puede especifican el administrador de transacciones de usar mediante la adición de un conjunto de atributos a un nombre de frijol o calificador. Por ejemplo, si su contexto de aplicación define múltiples administradores de transacciones con los 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 utilizar el calificador para especificar el administrador de transacciones de usar:

public class TransactionalService {

    @Transactional("account")
    public void setSomethingInAccount() { ... }

    @Transactional("businessData")
    public void doSomethingInBusinessData() { ... }
}

Otros consejos

Esta entrada Primavera Jira discute el tema un poco:

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

Yo creo que podría ser un administrador de transacciones por conexión si no se está usando en dos fases. Sólo tiene que crear dos administradores de transacciones e inyectarlos con la conexión adecuada.

Sin embargo, debo hacer la pregunta: ¿por qué cree que necesita dos administradores de transacciones? Puede tener más de una conexión de base de datos. Los DAO que utilizan las conexiones pueden y deben ser instanciadas por diferentes servicios, cada uno de los cuales se pueden anotar con su propia configuración transaccionales. Un administrador puede acomodar a ambos. ¿Por qué cree que necesita dos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top