Репозитории Autowire из похожих таблиц в разных источниках данных

#spring-boot #jpa

#весенняя загрузка #jpa

Вопрос:

У меня есть две версии одного и того же приложения. Они используют похожие схемы баз данных. Я хочу запустить тест junit, который сравнивает две таблицы с обеих сторон. Я использую Springboot и JPA. Я могу автоматически подключить оба источника данных в одном тесте. Я могу автоматически подключить CrudRepository для одной из таблиц в основном источнике данных. Но как я могу автоматически подключить аналогичный репозиторий для той же таблицы, которая находится во втором источнике данных, в то же время в том же тесте Junit? Я хотел бы сделать что-то подобное в том же классе:

 @Autowired( Datasource="primarydatasource")
CustomerRepository fistCustomerRepository;

@Autowired( Datasource="seconddatasource")
CustomerRepository secondCustomerRepository;
  

Я проверил множество руководств и ответов здесь, но я не нашел четкого примера по этому вопросу.

Ответ №1:

Ответ №2:

Вы можете создать два EntityManager

 @Bean("em1")
public LocalContainerEntityManagerFactoryBean em1(
        EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(customDataSource1())
            .packages(DataSource.class)
            .build();
}

@Bean("em2")
public LocalContainerEntityManagerFactoryBean em2(
        EntityManagerFactoryBuilder builder) {
    return ...;
}
  

Затем вы можете внедрить entity manager в свой репозиторий

     @Repository
    class CustomerRepositoryOracle{
        @PersistenceContext(name="em1")
        private EntityManager entityManager;
    }

    @Repository
    class CustomerRepositoryPostgreSQL{
        @PersistenceContext(name="em2")
        private EntityManager entityManager;
    }
  

Комментарии:

1. Должен ли я создать два класса для репозиториев, даже если схема точно такая же? И как мне выразить, что один связан с первым источником данных, а другой — со вторым источником данных? В вашем примере я не вижу, как это узнать. Спасибо

2. Если схема одинакова, создайте абстрактный класс и передайте entity manager из дочернего класса, @PersistenceContext(name=»em1″) private EntityManager EntityManager;