我有2个数据库(MySql和HSQLDB)。我配置了2个数据源和2个EntityManagerFactory bean。我还可以配置2个对应的JpaTransactionManager bean。
但是我不知道如何指定应使用其中的哪一个来管理具体服务类的事务。我想为此使用@Transactional注释,但实际上我只能指定txManagers之一:
<tx:annotation-driven transaction-manager="manager"/>
这种情况下的出路是什么?
声明你的<tx:annotation-driven>无事务管理器属性,为事务管理器声明限定符,如下所示:
<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)
JpaTransactionManager的Javadoc对此有一些建议:
JpaTransactionManager
Javadoc
该事务管理器适用于使用单个JPA EntityManagerFactory进行事务数据访问的应用程序。要访问同一事务中的多个事务资源,必须使用JTA(通常通过JtaTransactionManager)。请注意,你需要相应地配置JPA提供程序,以使其参与JTA事务。
换句话说,如果你发现自己有多个实体管理器和相应的TX管理器,则应该考虑使用一个实体管理器JtaTransactionManager。实体经理应该能够参与JTA交易,这将使你在两个实体经理之间都具有完全的交易能力,而不必担心你一次在哪个实体经理中。
JtaTransactionManager
当然,JtaTransactionManager确实需要完整的支持JTA的应用程序服务器,而不是像Tomcat这样的普通servlet引擎。