Java SpringJPA:意外回滚异常隐藏了我需要处理的实际异常
我正在spring boot中试用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
@事务性。我已经编写了一个包含多个表插入的服务,如果出现任何异常,我希望整个过程回滚。
这很好,但我得到的不是导致回滚的实际异常,而是意外回滚异常
@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
。