Spring JPA Repository save not not into the database into the database

时间:2017-12-28 22:48:15

标签: java spring hibernate spring-boot spring-data-jpa

我启动了一个包含@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不适用于数据库。事实上,它们甚至不会显示在调试输出中。

  • 我在保存中添加了一个txn管理器检查并验证了txn 积极可用。
  • 我在运行
  • 时没有看到任何Exception
  • 所有其他JpaRepository实施都按预期工作

我在service.flush()新创建的对象之后直接添加了对service.save()的调用,并在几次更新之后再次添加了一个先前读取的对象(在同一个txn中),在这两个实例中,我看到了txn在flush方法中处于活动状态,但是当调用repository.flush()时,我得到一个&#34;没有正在进行的事务&#34;例外。

我错过了什么?

3 个答案:

答案 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有点神奇。

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

答案 2 :(得分:0)

问题与从事务中生成新线程有关,实际上在事务已提交之后(在计算机时间内)执行了SQL插入。

不确定为什么没有抛出异常,但是将插入回到事务线程中会修复所有内容。