Я работаю над приложением, в котором мне нужна транзакция из двух разных баз данных.Я настроил два объекта управления данными и установил один как @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