Spring boot: два entityManager, использующих одну и ту же основную базу данных - PullRequest
0 голосов
/ 12 марта 2019

Я работаю над приложением, в котором мне нужна транзакция из двух разных баз данных.Я настроил два объекта управления данными и установил один как @Primary.Каким-то образом обе транзакции попадают в базу данных @primary, что выглядит странно для меня.Подскажите, пожалуйста, в чем заключается ошибка в моем коде.

Первичная конфигурация базы данных:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages =    {"com.nbn.firstdb"},entityManagerFactoryRef = "devEntityManager", transactionManagerRef = "devTransactionManager")
public class DevDatabaseConfiguration {

@Autowired
private Environment environment;

@Primary
@Bean(name = "devTransactionManager")
public PlatformTransactionManager anotherTransactionManager(
        @Qualifier("devEntityManager") EntityManagerFactory devEntityManagerFactory) {
    return new JpaTransactionManager(devEntityManagerFactory);
}
@Primary
@Bean(name = "devEntityManager")
public LocalContainerEntityManagerFactoryBean userEntityManager(EntityManagerFactoryBuilder builder,
        @Qualifier("devDataSource") DataSource ds) {
    // Use these properties to let spring work on batch insertion
    Map<String, Object> jpaProperties = new HashMap<>();
    jpaProperties.put("hibernate.jdbc.batch_size", 500);
    jpaProperties.put("hibernate.order_inserts", true);
    jpaProperties.put("hibernate.order_updates", true);

    return builder.dataSource(ds).packages("com.nbn.firstdb").persistenceUnit("devPersistence").properties(jpaProperties)
            .build();
}
@Primary
@Bean(name = "devDataSource")
public DataSource devDataSource() {

    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName(environment.getRequiredProperty("dev.datasource.type"));
    ds.setUrl(environment.getRequiredProperty("dev.datasource.url"));
    ds.setUsername(environment.getRequiredProperty("dev.datasource.username"));
    ds.setPassword(environment.getRequiredProperty("dev.datasource.password"));
    return ds;
}

ВторичныйКонфигурация базы данных

@Configuration
@EnableJpaRepositories(basePackages = {
    "com.nbn.seconddb" }, entityManagerFactoryRef = "prodEntityManager", transactionManagerRef = "prodTransactionManager")
public class DatabaseConfiguration {

@Autowired
private Environment environment;

@Bean(name = "prodDataSource")
public DataSource dataSource() {
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName(environment.getRequiredProperty("spring.datasource.driver-class-name"));
    ds.setUrl(environment.getRequiredProperty("spring.datasource.url"));
    ds.setUsername(environment.getRequiredProperty("spring.datasource.username"));
    ds.setPassword(environment.getRequiredProperty("spring.datasource.password"));
    return ds;
}

@Bean(name = "prodTransactionManager")
public PlatformTransactionManager anotherTransactionManager(
        @Qualifier("prodEntityManager") EntityManagerFactory prodEntityManagerFactory) {
    return new JpaTransactionManager(prodEntityManagerFactory);
}

@Bean(name = "prodEntityManager")
public LocalContainerEntityManagerFactoryBean userEntityManager(EntityManagerFactoryBuilder builder,
        @Qualifier("prodDataSource") DataSource ds) {
    // Use these properties to let spring work on batch insertion
    Map<String, Object> jpaProperties = new HashMap<>();
    jpaProperties.put("hibernate.jdbc.batch_size", 500);
    jpaProperties.put("hibernate.order_inserts", true);
    jpaProperties.put("hibernate.order_updates", true);

    return builder.dataSource(ds).packages("com.nbn.seconddb").persistenceUnit("prodPersistence")
            .properties(jpaProperties).build();
}

Служба, использующая первую службу базы данных:

@Service
public class DevDatabaseService {

@PersistenceContext(name = "devEntityManager")
private EntityManager entityManager;

Служба, использующая вторичную службу базы данных:

@Service
public class DatabaseService {

@PersistenceContext(name = "prodEntityManager")
private EntityManager entityManager;

@SuppressWarnings("unchecked")
public void data() {

    System.out.println("prodEntityManager");

обе службы обращаются к одной и той же базе данных, то есть помечены Primary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...