Есть ли способ определить менеджер транзакций по умолчанию в Spring
У меня есть приложение, которое использует Hibernate SessionFactory для одной базы данных. Мы добавляем еще одну базу данных для аналитики. Транзакции никогда не будут пересекаться, поэтому мне не нужна JTA, но я хочу использовать JPA EntityManager для новой базы данных.
Я настроил EntityManager и новый диспетчер транзакций, которые я квалифицировал, но Spring жалуется, что мне нужно квалифицировать мои существующие аннотации @Transactional. Я пытаюсь найти способ сказать Spring использовать txManager по умолчанию. Есть ли способ сделать это? В противном случае мне придется добавить квалификатор ко всем существующим аннотациям @Transactional, которых я бы хотел избежать, если это возможно.
@Bean(name = "jpaTx")
public PlatformTransactionManager transactionManagerJPA() throws NamingException {
JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
return txManager;
}
@Bean
public PlatformTransactionManager txManager() throws Exception {
HibernateTransactionManager txManager = new HibernateTransactionManager(sessionFactory());
txManager.setNestedTransactionAllowed(true);
return txManager;
}
Я получаю ошибку
No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2:
Спасибо
2 ответа
Я смог решить это с помощью @Primary
аннотирование
@Bean(name = "jpaTx")
public PlatformTransactionManager transactionManagerJPA() throws NamingException {
JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
return txManager;
}
@Bean
@Primary
public PlatformTransactionManager txManager() throws Exception {
HibernateTransactionManager txManager = new HibernateTransactionManager(sessionFactory());
txManager.setNestedTransactionAllowed(true);
return txManager;
}
Поскольку один и тот же тип компонента создается из двух методов, вы должны квалифицировать аннотацию @Transactional с указанным компонентом. Самый простой способ удовлетворить ваши потребности - использовать два разных контекста приложения Spring. Один работает со старым источником данных, а другой - с новым. Каждый из этих контекстов будет иметь только один метод, создающий экземпляр PlatformTransactionManager.