【发布时间】:2017-12-28 22:48:15
【问题描述】:
我正在启动一个包含 @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 中,并且可以在三个父项目中的两个中完美运行。如果没有,则 INSERT/UPDATE 不适用于数据库。事实上,它们甚至没有显示在调试输出中。
- 我已在保存中添加了 txn 管理器检查并验证了 txn 处于活动状态且可用。
- 我在运行时没有看到任何
Exception - 所有其他
JpaRepository实现都按预期工作
我在新创建的对象的service.save() 之后直接添加了对service.flush() 的调用,并且在对先前读取的对象(在同一个 txn 中)进行了几次更新后再次调用,在这两种情况下,我都看到 txn 在flush 方法,但是当repository.flush() 被调用时,我得到一个“没有事务正在进行”异常。
我错过了什么?
【问题讨论】:
-
MatrixTubeRepository 的实现是什么?
-
@gopal 是spring data jpa,不需要实现
-
正确,我目前正在使用免费的 CRUD 方法。
标签: java spring hibernate spring-boot spring-data-jpa