如何为存储库设置特定的DataSource?

时间:2015-04-01 17:53:20

标签: java spring spring-data-jpa

是否可以将特定DataSource分配给@Repository

我想创建一个测试环境,通常我想使用test-datasource,但是一些CrudRepository应该在不同的DB上运行(生产数据库;只读操作)

我可以告诉spring用于存储库的数据源是显式的吗?

public interface MyRepository extends CrudRepository<Customer, Long> {}

5 个答案:

答案 0 :(得分:3)

DataSourceJpaRepository都绑定到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"/>

答案 1 :(得分:1)

@EnableJpaRepositories是您问题的答案。根据非正式文件,这应该与CrudRepository一起使用。

请参阅此详细教程,了解如何执行此操作。我没有花时间在这里发布代码,因为你可以直接在其中更清楚地提及它。

link to the Tutorial...

答案 2 :(得分:0)

这取决于你的设计是什么,因为你可以遵循不同的实现,你可以为两个数据源声明两个bean,并在你的代码中指定你想要命中哪个,否则你可以定义两个不同的上下文和一个共享的上下文,您必须在代码中指定要调用的服务。 这是一个较旧的question,可能会帮助您实现第一种方法

答案 3 :(得分:-1)

尝试声明所需的数据源 @Bean 或明确声明为 @Primary

答案 4 :(得分:-2)

在声明name时,只需设置@PersistenceContext注释的EntityManager属性。

@PersistenceContext(name="persistence-unit-name")
private EntityManager em;