Есть ли способ определить менеджер транзакций по умолчанию в 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.

Другие вопросы по тегам