提问者:小点点

无法为事务嵌套异常打开JPA EntityManager是java. lang.IllegalStateException:已绑定到线程的键的值


我们使用JdbcTemplate在一些DAO中保存数据,在一些DAO中保存JPA。在从另一个与事务相关的程序化代码调用@Transaction方法(这里是saveAll方法)时,我们面临以下问题。

堆栈跟踪:

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; 

nested exception is 
java.lang.IllegalStateException:Already value [org.springframework.jdbc.datasource.ConnectionHolder@303ef11] for key [HikariDataSource (HikariPool-1)] bound to thread [http-nio-8091-exec-3]

示例代码片段:

OneServiceImpl:这里我们使用jdbcTemplate来保存数据并使用编程事务。从编程事务方法中,我们正在调用另一个使用JPA的serviceImpl类方法。

public CommonResponse saveCaseConfigurations(List<CaseDTO> caseList){
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                    protected void doInTransactionWithoutResult(TransactionStatus status) {
                        try {
                           scheduleServiceRepo.saveCases(caseList)); //Using JDBC template
                           ......
                           serviceTwo.updateCaseLogs(caseLogs); // calling secod service method.

                            
                        } catch (Exception ex) {
                            status.setRollbackOnly();
                            throw new CustomRunTimeException("Error due to"+ex.getMessage());
                        }

                    }
                });
}

TwoServiceImpl:这里我们使用的是Jpa和saveAll方法have@Transactional注解。

@Override
public CommonResponse updateCaseLogs(List<CaseLogs> caseLogs) {
    caseLogs = caseLogMasterRepo.saveAll(caseLogs);//Using JPA to save all in CaseLogs entity, failing here as saveAll is having @Transactional annotion.
    return new CommonResponse("SUCCESS", null,HttpStatus.OK);
}

我们对两个事务使用两个事务管理器。请帮助我如何禁用内部事务并将相同的事务携带到saveAll方法调用。


共1个答案

匿名用户

必须将所需的传播级别添加到您的JPA事务中。请参阅下面的帖子,其中包含所有JPA事务传播级别的详细信息。传播级别设置为必需以在单个范围内执行多个事务。

多个方法上的Spring JPA事务

相关问题