36

我有 2 个数据库(MySql 和 HSQLDB)。我配置了 2 个数据源和 2 个 EntityManagerFactory bean。我还可以配置 2 个对应的 JpaTransactionManager bean。

但我不知道如何指定它们中的哪一个应该用于管理具体服务类的事务。我想@Transactional为此目的使用注释,但实际上我只能指定一个 txManager:

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

摆脱这种局面的出路是什么?

4

4 回答 4

19

声明<tx:annotation-driven>没有事务管理器的属性,为事务管理器声明限定符,如下所示:

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

在@Transactional中使用此限定符作为来选择事务管理器之一:

@Transactional("txManager1")

或者,具有更多属性:

@Transactional(value = "txManager1", readOnly = true)   
于 2009-12-25T18:45:51.620 回答
18

JpaTransactionManager的javadoc对此有一些建议:

此事务管理器适用于使用单个 JPA EntityManagerFactory 进行事务数据访问的应用程序。JTA(通常通过 JtaTransactionManager)是访问同一事务中的多个事务资源所必需的。请注意,您需要相应地配置您的 JPA 提供程序以使其参与 JTA 事务。

换句话说,如果您发现自己有多个实体管理器,并且有相应的 tx 管理器,那么您应该考虑使用单个JtaTransactionManager来代替。实体管理器应该能够参与 JTA 事务,这将为您提供跨两个实体管理器的完整事务性,而不必担心您在任何时候都在哪个实体管理器中。

当然,JtaTransactionManager它确实需要一个完全支持 JTA 的应用服务器,而不是像 Tomcat 这样的普通 servlet 引擎。

于 2009-12-25T20:14:37.533 回答
13

自从它经过很长时间以来的正确答案。

Skaffman 在 JpaTransactionManager 对多个数据库的可用性方面可能是正确的。

但是有使用 2 个不同的数据库和 2 个不同的 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应该用于指定您未在其中指定限定符名称的那些@Transactional

于 2013-09-21T00:32:10.530 回答
6

您必须在 application-context.xml 中为此指定两个事务管理器,如下所示:

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

@Transactional 属性现在将使用其相关的事务管理器。

于 2011-10-21T05:52:05.653 回答