繁体   English   中英

Spring 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 不适用于数据库。 事实上,它们甚至没有显示在调试输出中。

  • 我在保存中添加了 txn 管理器检查并验证了 txn 处于活动状态且可用。
  • 我在运行时没有看到任何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 有点神奇。

https://spring.io/guides/gs/accessing-data-jpa/

问题与从事务内部产生一个新线程有关,该线程实际上在事务提交后(在计算机时间)执行 SQL 插入。

不知道为什么没有抛出异常,但是将插入返回事务线程修复了所有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM