Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Spring中定义默认事务管理器_Spring_Hibernate_Jpa_Transactionmanager - Fatal编程技术网

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

有没有办法在Spring中定义默认事务管理器,spring,hibernate,jpa,transactionmanager,Spring,Hibernate,Jpa,Transactionmanager,我有一个现有的应用程序,它对一个数据库使用Hibernate SessionFactory。我们正在添加另一个数据库进行分析。事务将永远不会交叉,因此我不需要JTA,但我确实希望对新数据库使用JPA EntityManager 我已经设置了EntityManager和新的事务管理器,我已经对它们进行了限定,但是Spring抱怨我需要限定我现有的@Transactional注释。我试图找到一种方法,告诉Spring使用txManager作为默认值。有没有办法做到这一点?否则,我必须将限定符添加到所

我有一个现有的应用程序,它对一个数据库使用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:

谢谢

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

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

将新的数据源配置拉入一个新文件(并放在一个单独的jar中)没有帮助。同样的错误。这可以在XML中完成,因为我们已经在XML中定义了事务管理器。谢谢。@Mustafa是的,您只需在希望成为主bean的bean上使用属性'primary'并将其设置为'true'。