如何为存储库设置特定的数据源?

How to set a specific DataSource for a Repository?

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

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

我可以明确地告诉 spring 哪个数据源用于存储库吗?

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

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

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

好吧,这取决于您的设计,因为您可以遵循不同的实现方式,f.e您可以为两个数据源声明两个 bean,并在您的代码中指定要命中的那个,否则您可以定义两个不同的上下文和一个共享上下文,您必须在代码中再次指定要调用的服务。 这是一个较旧的 question,可能对您的第一种方法有帮助

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

请参阅此详细教程了解如何执行此操作。我没有把精力放在post这里的代码上,因为你可以直接在里面引用它更清楚。

link to the Tutorial...

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"/>

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