Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置spring以使用两个不同的数据源。获取PlatformTransactionManager错误的NonuniqueBeandDefinitionException_Java_Spring_Hibernate_Spring Boot_Jpa - Fatal编程技术网

Java 如何配置spring以使用两个不同的数据源。获取PlatformTransactionManager错误的NonuniqueBeandDefinitionException

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

我正在开发SpringBoot应用程序,它已经在applicationContext.xml文件中建立了一个数据库连接,以及必要的事务管理器和供应商等

我现在需要将应用程序连接到第二个数据库。但我对此有意见。在我的单元测试中,连接很好,可以进行简单的查询来检索数据,这就是我所需要的。然而,当我将应用程序编译成jar并运行它时,我得到以下错误

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>