【问题标题】:Spring JPA Repository save not Inserting into the databaseSpring JPA Repository 保存未插入数据库
【发布时间】: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


【解决方案1】:

也许spring-test设置回滚默认值为true,

添加 @Rollback(false) 解决了我的问题。

【讨论】:

    【解决方案2】:

    使用 springdatajpa,您不需要所有这些魔法。 txn等

    在你的主应用程序类中使用这个注解。

    @EnableJpaRepositories(entityManagerFactoryRef = MatrixModelConfiguration.ENTITY_MANAGER_FACTORY_MATRIX, 
                                       transactionManagerRef = MatrixModelConfiguration.TRANSACTION_MANAGER_MATRIX)
    

    从本教程开始。与标准的 Hibernate/jpa 相比,Spring data jpa 有点神奇。

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

    【讨论】:

    • 我不明白这条评论?我使用上面提到的 *Refs 是因为我的示例是与几个 JpaRepository 实现结合实现的,每个实现都有不同的性能考虑等,它们都需要共存。
    【解决方案3】:

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

    不知道为什么没有抛出异常,但是将插入返回到事务线程中可以解决所有问题。

    【讨论】:

    • 您能否提供更多信息,您是如何做到的?
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多