如何在spring-data-jpa中使用多个数据源?

时间:2015-06-22 11:57:53

标签: java spring hibernate transactions spring-data-jpa

我阅读了所有相关问题并尝试了所有这些问题,但仍无法直接进行配置。

我有两个数据库,我想在我的应用程序中将它们用作数据源。

这是我的上下文文件:

<jee:jndi-lookup id="firstDataSource" jndi-name="java:/comp/env/jdbc/firstDS"   expected-type="javax.sql.DataSource" />
<jee:jndi-lookup id="secondDataSource" jndi-name="java:/comp/env/jdbc/secondDS" expected-type="javax.sql.DataSource" />

<bean name="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider"></bean>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="thisEntityManagerFactory">
    <property name="dataSource" ref="firstDataSource"/>
    <property name="packagesToScan" value="com.a.b.first.model"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true"/>
            <property name="databasePlatform" value= "org.hibernate.dialect.Oracle10gDialect"/>
            <property name="database" value="ORACLE"/>
        </bean>
    </property>
    <property name="persistenceUnitName" value="firstPersistenceUnit" />
    <property name="persistenceProvider" ref="persistenceProvider"></property>
    <property name="jpaProperties">
        <value>
            hibernate.generate_statistics = true
            hibernate.cache.use_second_level_cache = true
            hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
            hibernate.cache.use_query_cache = true
            <!--hibernate.hbm2ddl.auto=create-->
        </value>
    </property>
</bean>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="otherEntityManagerFactory">
    <property name="dataSource" ref="secondDataSource"/>
    <property name="packagesToScan" value="com.a.b.second.model"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true"/>
            <property name="databasePlatform" value= "org.hibernate.dialect.Oracle10gDialect"/>
            <property name="database" value="ORACLE"/>
        </bean>
    </property>
    <property name="persistenceUnitName" value="secondPersistenceUnit" />
    <property name="persistenceProvider" ref="persistenceProvider"></property>
    <property name="jpaProperties">
        <value>
            hibernate.generate_statistics = true
            hibernate.cache.use_second_level_cache = true
            hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
            hibernate.cache.use_query_cache = true
            <!--hibernate.hbm2ddl.auto=create-->
        </value>
    </property>
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="thisTransactionManager">
    <property name="entityManagerFactory" ref="thisEntityManagerFactory"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="otherTransactionManager">
    <property name="entityManagerFactory" ref="otherEntityManagerFactory"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

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

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

<jpa:repositories base-package="com.a.b.first.intf" entity-manager-factory-ref="thisEntityManagerFactory" transaction-manager-ref="transactionManager"/>
<jpa:repositories base-package="com.a.b.second.intf" entity-manager-factory-ref="otherEntityManagerFactory" transaction-manager-ref="otherTransactionManager" />

问题是当我尝试使用位于包 com.absecond.intf 下的存储库接口时,它会转到 firstDataSource 并抛出带有消息的SQLSyntaxErrorException“ ORA-00942:表或视图不存在“。因为第一个数据库中没有这样的表。

每个 EntityManagerFactory 的日志中有一行,说

  

为持久性单元构建JPA容器EntityManagerFactory   '默认'

在下一行中,它为 EntityManagerFactory 打印 PersistenceUnitInfo 。两个EntityManagerFactories的PersistenceUnitInfo的“Non JTA datasource”属性是相同的。我想这意味着两个持久性单元都使用相同的数据源。

我缺少什么?

感谢。

1 个答案:

答案 0 :(得分:0)

在您的服务层中,您应该具有以下内容:

@Service
@Transactional("thisTransactionManager")
public class ThisService{

   @Autowired
   private com.a.b.first.intf.Repo1 repo1;
}

@Service
@Transactional("otherEntityManagerFactory")
public class OtherService{

   @Autowired
   private com.a.b.second.intf.Repo1 repo1;
}

这样,当您调用服务方法时,TransactionInterceptor可以加载与您要操作的EntityManagerFactory相关联的相应事务管理器。