2016-05-23 68 views
0

我得到了这段代码。我使用的弹簧引导和JPA如何处理弹簧jpa @transactional和从catch块新插入

@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),内部交易将完成与外将回滚

的新方法

但我没有看到我的预期输出。

请告知

+0

正确。这确实是一个重复 – Shiv

+0

@阿兰干草 - 即使按照原始线程中的说明,我仍然看到相同的问题。我将其作为个别方法中的交易,并添加了一个需要新的传播 – Shiv

回答

1

取下一流水平的@Transactional,并用它在那些实际执行的交易方法。 (如果你在该课程中有超过1种方法,当然)。

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

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

由于您有一个全局事务,它将完全回退。相反,您需要独立交易。

+0

我将其作为单个交易,但仍然没有看到它的工作。 – Shiv