【问题标题】:How to set a specific DataSource for a Repository?如何为存储库设置特定的数据源?
【发布时间】:2015-06-06 11:56:10
【问题描述】:
是否可以将特定的DataSource 分配给@Repository?
我想创建一个测试环境,通常我想在其中使用测试数据源,但少数CrudRepository 应该在不同的数据库(生产数据库;只读操作)上运行。
我可以告诉 spring 使用哪个数据源来显式存储库吗?
public interface MyRepository extends CrudRepository<Customer, Long> {}
【问题讨论】:
标签:
java
spring
spring-data-jpa
【解决方案1】:
DataSource 和 JpaRepository 都绑定到 EntityManager。您必须将存储库隔离到单独的包中才能满足您的要求。
这是一个例子:
<bean id="emf1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource">
<bean .../>
</property>
...
</bean>
<jpa:repositories base-package="org.example.package1" entity-manager-factory-ref="emf1"/>
<bean id="emf2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource">
<bean .../>
</property>
...
</bean>
<jpa:repositories base-package="org.example.package2" entity-manager-factory-ref="emf2"/>
【解决方案2】:
@EnableJpaRepositories 是您问题的答案。根据非正式文档,这应该与 CrudRepository 一起使用。
请参阅此详细教程以了解如何执行此操作。我没有努力在这里发布代码,因为您可以直接在其中更清楚地引用它。
link to the Tutorial...
【解决方案3】:
这取决于你的设计,因为你可以遵循不同的实现,你可以为两个数据源声明两个 bean,并在你的代码中指定你想要命中哪个,否则你可以定义两个不同的上下文和一个共享的上下文,您必须在代码中再次指定要调用的服务。
这是一个较旧的question,可能会对您的第一种方法有所帮助
【解决方案4】:
在声明EntityManager 时,只需设置@PersistenceContext 注释的name 属性即可。
@PersistenceContext(name="persistence-unit-name")
private EntityManager em;
【解决方案5】:
尝试声明所需的数据源@Bean 或明确声明为@Primary。