我们使用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方法调用。
必须将所需的传播级别添加到您的JPA事务中。请参阅下面的帖子,其中包含所有JPA事务传播级别的详细信息。传播级别设置为必需以在单个范围内执行多个事务。
多个方法上的Spring JPA事务