【问题标题】:Is there a way to define a default transaction manager in Spring有没有办法在 Spring 中定义默认事务管理器
【发布时间】:2013-04-02 22:26:33
【问题描述】:

我有一个将 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:

谢谢

【问题讨论】:

    标签: spring hibernate jpa transactionmanager


    【解决方案1】:

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

    【讨论】:

    • 这可以在 XML 中完成,因为我们已经在 XML 中定义了事务管理器。谢谢。
    • @Mustafa 是的,您只需在您希望成为主要的 bean 上使用属性“primary”并将其设置为“true”。
    【解决方案2】:

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

    【讨论】:

    • 将新的数据源配置拉入一个新文件(和一个单独的 jar)并没有帮助。同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2011-01-31
    • 2012-02-15
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多