Tengo 2 bases de datos (MySql y HSQLDB). He configurado 2 fuentes de datos y 2 EntityManagerFactory frijoles. También puedo configurar 2 corresponsal JpaTransactionManager frijoles.

Pero no sé cómo especificar cuál de ellos debe ser utilizado para administrar las transacciones de servicio concreto de la clase. Quiero usar @Transactional anotación para ese propósito, pero yo en realidad sólo se puede especificar uno de txManagers:

<tx:annotation-driven transaction-manager="manager"/>

¿Cuál es la manera de salir de esta situación?

InformationsquelleAutor Roman | 2009-12-25

4 Comentarios

  1. 18

    La javadoc para JpaTransactionManager tiene algún consejo sobre esto:

    Este gestor de transacciones es
    adecuado para aplicaciones que uso
    una sola JPA EntityManagerFactory para
    transaccional de acceso a datos. JTA
    (generalmente a través de
    JtaTransactionManager) es necesario
    para acceder a múltiples transaccional
    los recursos dentro de la misma transacción.
    Tenga en cuenta que usted necesita para configurar su
    JPA proveedor en consecuencia, para
    hacer participar en la JTA
    transacciones.

    En otras palabras, si usted se encuentra con varios gestores de entidad, con el correspondiente tx gerentes, entonces usted debería considerar el uso de una sola JtaTransactionManager lugar. La entidad que los gerentes deben ser capaces de participar en transacciones JTA, y este le transactionality a través de ambos gestores de entidad, sin hacving que preocuparse de que administrador de la entidad de que estás en un momento dado.

    De curso, JtaTransactionManager requiere un completo JTA-apoyo a la aplicación servidor, en lugar de vainilla servlet engine como Tomcat.

    • Probablemente yo no entiendo algo, pero pensé que el administrador de transacciones, utilizado en la Primavera, está basado en la transacción de base de datos administrador de decir, debemos crear tantas tx-gerentes de diferentes bases de datos que se utilice. ¿Está mal?
    • No es tan simple. Spring TX gerentes son sólo contenedores de otros mecanismos existentes, tales como la JTA, JPA/Hibernate o JDBC transacciones. JTA no está vinculado a una base de datos, es un distribuida multi-base de datos tx manager. El uso de Primavera no realmente cambiar la forma en que los mecanismos subyacentes debe ser utilizado, solo hace que sea más fácil.
    • Gracias, esto suena un poco inesperado para mí, voy a buscarlo en el Sol, en la documentación.
    • ¿Qué sucede si me anotar un método con 2 @Transactional() como :@Transactional(transactionManager = «customerTransactionManager»), @Transactional(transactionManager = «orderTransactionManager») ? Me gustaría saber cómo manejar ambos db transaccional en un método.
  2. 19

    Declarar su <tx:annotation-driven> sin transacción-administrador de atributo, declarar la fase de clasificación para los administradores de transacciones como este:

    <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <qualifier value="txManager1"/>
    </bean>

    Utilizar este calificador en @Transactional como un valor para seleccionar uno de los gestores de transacciones:

    @Transactional("txManager1")

    o, con más propiedades:

    @Transactional(value = "txManager1", readOnly = true)   
    • Esta solución funciona. Sin embargo, si usted tiene un calificador en el @Transactional anotación debe especificar un administrador de transacciones con el calificador elemento configurado. Al principio pensé que por defecto el administrador de transacciones se haría cargo, pero ese no fue el caso para mí. Se quejó de que no tenía una adecuada calificador configurado en mi administrador de transacciones de frijol.
    • Por favor, tenga en cuenta que esto se aplica a la Primavera del 3 en adelante
  3. 12

    Desde su después de mucho tiempo ya que las respuestas correctas.

    Skaffman puede estar en lo correcto en términos de usabilidad de JpaTransactionManager para múltiples bases de datos.

    Pero no es la solución de trabajo para el uso de 2 bases de datos distintas con 2 diferentes JpaTransactionManager.

      @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 ser usado para especificar para los que no se especifique el nombre del calificador en @Transactional

  4. 6

    Usted tiene que especificar dos administradores de transacciones para que en application-context.xml como a continuación:

    <tx:annotation-driven transaction-manager="manager1"/>
    <tx:annotation-driven transaction-manager="manager2"/>

    @Transactional atributo de ahora utilizará el correspondiente administrador de transacciones.

    • Esto funcionó para mí y no tengo que especificar el calificador de la txManager frijoles o en el @Transactional anotación. Yo era capaz de tener acceso a dos diferentes sesión de las fábricas también.
    • Ya, lo mismo conmigo. Yo también no tiene que especificar calificador con @Transactional anotación.
    • Interesante, si miro AnnotationDrivenBeanDefinitionParser que los procesos de la tx:annotation-driven todos se realiza una vez al contexto sólo! Así que la segunda línea es totalmente inútil.
    • Esto funcionó para mí! Es una lástima que la Primavera documento oficial no menciona este truco para configurar varias DataSourceTransactionManager.

Dejar respuesta

Please enter your comment!
Please enter your name here