![](/img/trans.png)
[英]How to save data immediately to the database using Spring Boot and JPA Repository
[英]Spring JPA Repository save not Inserting into the database
我正在启动一个包含@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 不适用于数据库。 事实上,它们甚至没有显示在调试输出中。
Exception
JpaRepository
实现都按预期工作我在新创建的对象的service.save()
之后直接添加了对service.flush()
的调用,并在几次更新之前读取的对象(在同一个 txn 内)之后再次添加了对service.flush()
的调用,在这两种情况下,我都看到 txn 处于活动状态在flush方法中,但是当repository.flush()
被调用时,我得到一个“没有正在进行的事务”异常。
我错过了什么?
也许 spring-test 设置回滚默认值是 true,
添加@Rollback(false)
解决了我的问题。
使用 springdatajpa,您不需要所有这些魔法。 txn 等
在您的主应用程序类中使用此注释。
@EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX,
transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
从本教程开始。 与标准 Hibernate/jpa 相比,Spring 数据 jpa 有点神奇。
问题与从事务内部产生一个新线程有关,该线程实际上在事务提交后(在计算机时间)执行 SQL 插入。
不知道为什么没有抛出异常,但是将插入返回事务线程修复了所有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.