使用多个事务管理器时无法打开 JPA EntityManager 进行事务

问题描述 投票:0回答:1

已将键 [HikariDataSource (HikariPool-1)] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@20f78dcb] 绑定到线程

首先,我使用了为与 JDBC 模板一起使用而创建的事务管理器。

  @Bean
    @Primary
    public PlatformTransactionManager dbTxManager() {
        return new DataSourceTransactionManager(clientDestinationDataSource());
    }

但是,在这种情况下,无法保存到数据库(相反,读取没有错误):

抛出异常;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“transactionManager”的 bean 可用:没有为限定符“transactionManager”找到匹配的 TransactionManager bean - 限定符不匹配,bean 名称也不匹配!

在事务注释中显式指定正确的管理器并不能解决问题。

ClientRepositry repo;

@Transactional("dbTxManager")
    @Override
    public Long processClient(Client client){
    repo.findById(client.getId())

   ...

   repo.save(client); //error

}

我决定设置一个单独的EntityManager。

@EnableJpaRepositories(
        entityManagerFactoryRef = "clientEntityManagerFactory",
        transactionManagerRef = "transactionManagerSimple",
        basePackages = "com.integration")
@EnableTransactionManagement
@Configuration
public class DbConfiguration {

    @Bean
    public HikariDataSource clientDataSource(DataSourceProperties clientDestinationDbProps) {
        return clientDestinationDbProps
                .initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();
    }


    @Bean
    public LocalContainerEntityManagerFactoryBean clientEntityManagerFactory(HikariDataSource clientDataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(clientDataSource);
        entityManagerFactoryBean.setPackagesToScan(
                "com.integration.domain",
                "com.integration.repository"
        );

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);

        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        entityManagerFactoryBean.setJpaProperties(properties);

        return entityManagerFactoryBean;
    }

    @Bean
    public PlatformTransactionManager transactionManagerSimple(EntityManagerFactory clientEntityManagerFactory) {
        return new JpaTransactionManager(clientEntityManagerFactory);
    }
}

数据处理时,无法开启交易。

抛出异常;嵌套异常是 org.springframework.transaction.CannotCreateTransactionException: 无法打开 JPA EntityManager 进行事务;嵌套异常是 java.lang.IllegalStateException:键 [HikariDataSource (HikariPool-1)] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@20f78dcb] 已经绑定到线程

你有什么想法如何解决这个问题吗?

postgresql spring-boot spring-data-jpa
1个回答
0
投票

要解决与此主题相关的错误,需要显式指定产生该错误的事务管理器。

  @Transactional(value = "transactionManagerSimple")
    @Override
    public Long processClient(Client client) {

...

© www.soinside.com 2019 - 2024. All rights reserved.