Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
带有两个JPA数据库的Spring boot webapp_Spring_Jpa - Fatal编程技术网

带有两个JPA数据库的Spring boot webapp

带有两个JPA数据库的Spring boot webapp,spring,jpa,Spring,Jpa,我想使用最新版本的SpringBatch管理器(1.3.0版)将现有的SpringBatch作业迁移到SpringBootWebApp 在我的persistence.xml中,我使用两个PlatformTransactionManager实例配置了两个数据源。 显然,SpringBoot在默认情况下无法处理这种情况 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying

我想使用最新版本的SpringBatch管理器(1.3.0版)将现有的SpringBatch作业迁移到SpringBootWebApp

在我的
persistence.xml
中,我使用两个
PlatformTransactionManager
实例配置了两个数据源。 显然,SpringBoot在默认情况下无法处理这种情况

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: transactionManager,osm.transactionManager
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:313)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:337)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:252)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    //...
有没有想过如何覆盖spring引导默认值,以便可以同时使用两个数据源

EDIT:奇怪的是,尽管定义了两个不同的
JpaTransactionManager
bean,但事务方面支持似乎没有bean的名称

<bean id="osm.transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="osm.entityManagerFactory" />
</bean>

<tx:advice id="txAdvice" transaction-manager="osm.transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="osmServiceOperation"
        expression="execution(* com.company.osm.service.spec..*Service.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="osmServiceOperation" />
</aop:config>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

您必须手动配置数据源:

        @Bean
        public DataSource dataSource1() {
                DriverManagerDataSource dataSource = new DriverManagerDataSource();

                dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
                dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
                dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
                dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

                return dataSource;
        }

            @Bean
            public DataSource dataSource2() {
                   ...

                    return dataSource;
            }
这样,由spring自动配置的数据源将不再可用


如果自动连接数据源,请小心。您必须使用限定符来指定应该使用哪一个。

这两个数据源都已在persistence.xml中配置,该文件加载在我的WebAppConfiguration类中。这还不够吗?好吧,我来试试。@achingfingers最重要的部分是如何使用豆子。如果它们是按类型连接的,spring有两个相同类型的bean,不知道该做什么。
protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) {
    // ...
    else if (this.transactionManagerBeanName != null) { <-- Should go here!
        return this.beanFactory.getBean(this.transactionManagerBeanName, PlatformTransactionManager.class);
    }
    else {
        return this.beanFactory.getBean(PlatformTransactionManager.class); <-- Goes here!
    }
}
        @Bean
        public DataSource dataSource1() {
                DriverManagerDataSource dataSource = new DriverManagerDataSource();

                dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
                dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
                dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
                dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

                return dataSource;
        }

            @Bean
            public DataSource dataSource2() {
                   ...

                    return dataSource;
            }