如何处理spring jpa @transactional和来自catch块的新插入

时间:2016-05-23 15:43:25

标签: java spring hibernate jpa transactions

我收到了这段代码。我正在使用spring boot和jpa

@Transactional

public class MyClass {

    public void createSomething() {
        try {
            saveAndFlush();
        } catch (Exception e) {
            // Since error has occured I want to insert this information
            // into a audit table

            repository.saveAndFlush();

        }
    }

}

现在,当异常发生时,事务将回滚,因此不会发生错误表插入。

我正在看

HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in XXXXX entry (don't flush the Session after an exception occurs)

为了解决这个问题,我尝试在标有@Transactional(propagation = Propagation.REQUIRES_NEW)的新方法中插入错误,理解内部事务将完成,外部将回滚

但我没有看到我想要的输出。

请告知

1 个答案:

答案 0 :(得分:1)

从类级别删除@Transactional,并将其用于实际执行事务的那些方法。 (当然,如果你在该课程中有多个方法)。

如果您希望独立事务提交/回滚到数据库,则在方法上使用REQUIRES_NEW传播,这不会干扰全局事务。

未提及任何传播的'@Transactional'的默认行为是,加入全局(调用)事务(如果有),如果没有启动新事务。

由于您拥有全局事务,因此它将完全回滚。相反,您需要独立交易。