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