Spring Boot Repository带注释的接口

时间:2016-09-01 07:40:58

标签: spring hibernate spring-boot spring-data spring-data-jpa

我的应用程序基于Spring Boot,Hibernate,MySQL使用Spring Data JPA来拼接它们。

用例是使用从属数据库节点进行大量读取操作,以避免从主mysql节点提供所有流量。实现此目的的一种方法是让多个实体管理器指向单独的数据源(一个到主节点,另一个到从节点)。在下面的SO问题和博客中已经很好地解释了这种方式。

Spring Boot, Spring Data JPA with multiple DataSources

https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-and-spring-data-jpa/

我遇到的问题是要了解是否有一种方法可以在我的Repository Annotated Interface中为不同的用例注入不同的实体管理器。

我认为可以完成的唯一方法是使用自定义实现扩展存储库,该实现使用自定义实体管理器注释相关的persistenceContext,如下所示。

public interface CustomerRepository extends JpaRepository<Customer, Integer>, MyCustomCustomerRepository{
}

public class MyCustomCustomerRepositoryImpl implements MyCustomCustomerRepository {

        @PersistenceContext(unitName = "entityManagerFactoryTwo")
        EntityManager entityManager;
}

我想避免做这个自定义实现。任何有关解决此用例的问题(我认为应该非常普遍)都将不胜感激。

注意:两个数据库中的实体都是相同的,因此为实体扫描和类似解决方案提供单独的包可能不起作用。

2 个答案:

答案 0 :(得分:4)

这是一个很好的示例,您可以使用: dynamic-datasource-routing-with-spring。 在里面你可以找到一个AbstractRoutingDatasource +一个拦截器,用于自定义注释,将服务方法连接到一个必需的数据库。 但是,您可以明确地使用数据源切换。

答案 1 :(得分:2)

下面是显示差异的pull请求以及我如何使用大多数配置注释驱动而不是xml。它基于上面的cra6的答案。即使用spring的RoutingDataSource功能。

https://github.com/himanshuvirmani/rest-webservice-sample/pull/1/files