Java SpringJPA:意外回滚异常隐藏了我需要处理的实际异常

Java SpringJPA:意外回滚异常隐藏了我需要处理的实际异常,java,mysql,spring,spring-data-jpa,spring-transactions,Java,Mysql,Spring,Spring Data Jpa,Spring Transactions,我正在spring boot中试用@事务性。我已经编写了一个包含多个表插入的服务,如果出现任何异常,我希望整个过程回滚。 这很好,但我得到的不是导致回滚的实际异常,而是意外回滚异常 @transactional public void insertIntoTables(){ repositoryone.save(new Table1()); repositorytwo.save(new Table2()); //expecting data integrity violation

我正在spring boot中试用
@事务性
。我已经编写了一个包含多个表插入的服务,如果出现任何异常,我希望整个过程回滚。
这很好,但我得到的不是导致回滚的实际异常,而是
意外回滚异常

@transactional
public void insertIntoTables(){
    repositoryone.save(new Table1());
    repositorytwo.save(new Table2()); //expecting data integrity violation exception on this line
}
上面的代码不是抛出
DataIntegrityViolationException
,而是抛出
意外回滚异常。当然,我希望回滚发生,只是希望避免异常,以便使用实际的异常。

如何获取实际异常以进行处理?

甚至我以前也遇到过类似的问题。我通过为添加回滚来处理它。下面是我如何处理的

  • 导入的org.springframework.transaction.annotation.Transactional
  • 然后,在我的服务方法之上使用@Transactional(rollboor=Exception.class),而不是@Transactional

  • 这将处理任何运行时异常。因此,DataIntegrityViolationException应该显示给用户。

    您将在哪里抛出一个
    DataIntegrityViolationException
    ?如果您希望抛出该异常而不是
    UnexpectedRollbackException
    ,则使用
    try catch
    块包围
    save
    方法,捕获
    UnexpectedRollbackException
    ,并抛出您希望抛出的异常。这是因为异常发生在提交期间。如果要在提交之前触发约束检查,请执行
    saveAndFlush
    (假设您正在为存储库扩展
    JpaRepository
    ),或直接在
    EntityManager
    上调用
    flush
    。这将在提交之前触发与数据库的状态同步,并将为您获取另一个
    DataAccessException