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

jax*_*jax 6 spring spring-boot

我需要从一个应用程序连接到两个不同的数据库.问题是我的appEntityManager没有与之关联的事务管理器,我不知道该怎么做.该@Primary adminEntityManager能够描述使用弹簧启动提供一个没有任何麻烦这里.

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

我已经注释了配置

@EnableTransactionManagement
Run Code Online (Sandbox Code Playgroud)

这是相关的豆子

@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;
}
Run Code Online (Sandbox Code Playgroud)

更新

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

man*_*ish 5

看看这是否有效:

@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(...) { ... }
Run Code Online (Sandbox Code Playgroud)

我对您的配置所做的唯一更改是显式声明管理端的事务管理器并将该事务管理器标记为默认值。