首页 文章

Spring Boot中的多个事务管理器,用于不同的EntityManagers

提问于
浏览
5

我需要从一个应用程序连接到两个不同的数据库 . 问题是我的appEntityManager没有与之关联的事务管理器,我不知道该怎么做 . @Primary adminEntityManager能够使用spring boot提供的那个,没有任何问题,如here所述 .

上面的配置几乎可以单独使用 . 要完成图片,您还需要为两个EntityManagers配置TransactionManagers . 如果你把它标记为@Primary,其中一个可以被Spring Boot中的默认JpaTransactionManager选中 . 另一个必须明确地注入新实例 . 或者您可以使用跨越两者的JTA事务管理器 .

我已经注释了配置

@EnableTransactionManagement

这是相关的 beans 子

@Bean
@ConfigurationProperties(prefix = "datasource.app")
public DataSource appDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@Primary
@ConfigurationProperties(prefix = "datasource.admin")
public DataSource adminDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
public LocalContainerEntityManagerFactoryBean appEntityManagerFactory(
        final EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(appDataSource())
            .packages("au.com.mycompany.app.bomcommon.domain")
            .persistenceUnit("appPersistentUnit")
            .build();
}

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean adminEntityManagerFactory(
        final EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(adminDataSource())
            .packages("au.com.mycompany.app.bombatch")
            .persistenceUnit("adminPersistentUnit")
            .build();
}

//I thought this would do it but I am getting an exception
//No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: appTransactionManager,transactionManager
@Bean
public JpaTransactionManager appTransactionManager(@Qualifier("appEntityManagerFactory") final EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

更新

我最后以不同的方式做到了这一点 . see here .

1 回答

  • 4

    看看这是否有效:

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "datasource.admin")
    public DataSource adminDS() { ... }
    
    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean adminEMF(...) { ... }
    
    @Bean
    @Primary
    public JpaTransactionManager adminTM(...) { ... }
    
    @Bean
    public LocalContainerEntityManagerFactoryBean appEMF(...) { ... }
    
    @Bean
    public JpaTransactionManager appTM(...) { ... }
    

    我对您的配置进行的唯一更改是明确声明管理端的事务管理器,并将该事务管理器标记为默认值 .

相关问题