Java 如何配置spring以使用两个不同的数据源。获取PlatformTransactionManager错误的NonuniqueBeandDefinitionException
我正在开发SpringBoot应用程序,它已经在applicationContext.xml文件中建立了一个数据库连接,以及必要的事务管理器和供应商等 我现在需要将应用程序连接到第二个数据库。但我对此有意见。在我的单元测试中,连接很好,可以进行简单的查询来检索数据,这就是我所需要的。然而,当我将应用程序编译成jar并运行它时,我得到以下错误Java 如何配置spring以使用两个不同的数据源。获取PlatformTransactionManager错误的NonuniqueBeandDefinitionException,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我正在开发SpringBoot应用程序,它已经在applicationContext.xml文件中建立了一个数据库连接,以及必要的事务管理器和供应商等 我现在需要将应用程序连接到第二个数据库。但我对此有意见。在我的单元测试中,连接很好,可以进行简单的查询来检索数据,这就是我所需要的。然而,当我将应用程序编译成jar并运行它时,我得到以下错误 NoUniqueBeanDefinitionException: No qualifying bean of type "org.springframewo
NoUniqueBeanDefinitionException: No qualifying bean of type "org.springframework.transaction.PlatformTransactionManager" available: expected single matching bean but found 2: transactionManager, transactionManager2
我花了很长时间研究如何解决这个问题,以及我找到的建议修复方法,但都没有奏效
我有一个persistence.xml,定义了两个持久性单元。在applicationContext.xml中,我定义了两个数据源、两个事务管理器和两个实体管理器工厂。然后我使用@PersitnceContext和@Transactional注释来说明要使用哪个持久化单元和管理器,但仍然会得到一个错误。我还将标签添加到了应用程序上下文文件中,因为我认为这是@transactional注释的建议修复,但仍然不走运
下面是我的代码,有人能发现我犯的错误吗?为什么它不能按预期工作
applicationContext.xml
实施
解决方案
被接受的答案对我来说是正确的解决方案,但有几点需要注意。这些bean必须指向它们各自的entityManagerFactory,您需要注意在哪个bean上设置autowire候选=false,因为我一开始设置的是错误的,结果导致事务回滚。我认为可能有更清洁的解决方案,但作为一种快速修复方法,它可以很好地工作尝试以下方法:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" autowire-candidate="false">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
您在xml中使用过或吗?xml已经使用了。我不确定这是做什么的,它已经存在于我继承的代码中。是否需要在两个事务管理器上都这样做?还是只有一个?用我的替换这两个bean..确保只有transactionManager是autowire候选者=false这两个bean不能具有相同的权限?我得到一个Bean名称“transactionManager”已经在这个元素中使用了,我假设其中一个应该是transactionManager1,另一个应该是transactionManager2,并引用它们的特定工厂?对不起,我的错,应该是transactionManager2。编辑了答案。看起来这样做有效!我还必须确保每个bean都指向它自己的entitymanagerfactory。你可能希望你的答案也能反映这一点。您能解释一下autowire候选项=false的作用吗?为什么只需要一颗豆子就可以了?
@Repository
@Transactional("transactionManager2")
public class myDaoImpl extends GenericJPADao<Integer, Integer> implements ImyDao {
@PersistenceContext(unitName="proxy2")
protected EntityManager em;
}
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" autowire-candidate="false">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>