【问题标题】: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】:

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

【讨论】:

    【解决方案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

        【讨论】:

          猜你喜欢
          • 2020-08-02
          • 1970-01-01
          • 2020-10-03
          • 2016-04-15
          • 2011-08-16
          • 2017-04-08
          • 2023-04-09
          • 2017-05-25
          • 2023-03-12
          相关资源
          最近更新 更多