我启动了一个包含@Service
类的spring-boot应用程序:
@Service
@Transactional (value = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
public class MatrixTubeService implements IMatrixTubeService {
@Autowired
MatrixTubeRepository repository;
@Override
public void flush() {
boolean txn = TransactionSynchronizationManager.isActualTransactionActive();
System.out.println("flush txn exist " + txn);
repository.flush();
}
@Override
public MatrixTube save(MatrixTube matrixTube) {
boolean txn = TransactionSynchronizationManager.isActualTransactionActive();
String txnName = TransactionSynchronizationManager.getCurrentTransactionName();
System.out.println("save txn exist " + txn + " as " + txnName);
return repository.save(matrixTube);
}
.
.
.
将调用包装到这个简单的@EnableJpaRepositories
类:
@EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX,
transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
public interface MatrixTubeRepository extends JpaRepository<MatrixTube, Long> {
}
此代码位于依赖jar中,并在三个父项目中的2个中运行完美。如果没有,则INSERT / UPDATE不适用于数据库。事实上,它们甚至不会显示在调试输出中。
Exception
JpaRepository
实施都按预期工作我在service.flush()
新创建的对象之后直接添加了对service.save()
的调用,并在几次更新之后再次添加了一个先前读取的对象(在同一个txn中),在这两个实例中,我看到了txn在flush方法中处于活动状态,但是当调用repository.flush()
时,我得到一个&#34;没有正在进行的事务&#34;例外。
我错过了什么?
答案 0 :(得分:2)
也许春季测试设置的回滚默认值为true,
添加@Rollback(false)
解决了我的问题。
答案 1 :(得分:0)
使用springdatajpa,你不需要所有这些魔法。 txn等。
在主应用程序类中使用此批注。
@EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX,
transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
从本教程开始。与标准的Hibernate / jpa相比,Spring数据jpa有点神奇。
答案 2 :(得分:0)
问题与从事务中生成新线程有关,实际上在事务已提交之后(在计算机时间内)执行了SQL插入。
不确定为什么没有抛出异常,但是将插入回到事务线程中会修复所有内容。