我有不同的类(class) extends CrudRepository<T, T>
Spring Data JPA 框架。它隐式使用全局 EntityManager
bean 。
现在我想创建一个连接到不同数据库的服务。这意味着我必须以某种方式注入(inject)不同的 em/datasource。但是如何将数据库显式绑定(bind)到 spring bean/服务?
最佳答案
有多种方法可以做到这一点。我们在一个项目中所做的是为不同的数据源定义两个不同的包,并为它们定义不同的 bean,如下所示:
<beans>
<jpa:repositories base-package="com.abc.repository" transaction-manager-ref="abcTransactionManager" entity-manager-factory-ref="abcEntityManagerFactory"/>
<jpa:repositories base-package="com.def.repository" transaction-manager-ref="defTransactionManager" entity-manager-factory-ref="defEntityManagerFactory"/>
<bean id="abcTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="abcEntityManagerFactory"/>
<qualifier value="abcTransactionManager"></qualifier>
</bean>
<bean id="defTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="defEntityManagerFactory"/>
<qualifier value="defTransactionManager"/>
</bean>
</beans>
同样定义对应的entity manager factory。这样,包 abc 中定义的任何存储库都将使用 abcEntityManager 并且类似地用于 def。
我看到它的另一种工作方式是使用适当的实体管理器应用事务,如下所示:
@Transactional("abcTransactionManager")
关于java - 如何将 Spring 服务委托(delegate)给不同的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23262360/