有没有办法在Spring中定义默认事务管理器

时间:2013-04-10 21:24:48

标签: spring hibernate jpa transactionmanager

我有一个现有的应用程序,它将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 个答案:

答案 0 :(得分:25)

我能够使用@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;
  }

答案 1 :(得分:0)

由于从两种方法生成相同类型的bean,因此必须使用命名bean限定@Transactional注释。一个简单的方法来满足您的需求将是使用两个不同的Spring应用程序上下文。一个使用旧数据源操作,另一个使用new操作。每个上下文只有一个方法产生PlatformTransactionManager实例。