如果数据库 id 不再存在,如何忽略删除异常?

mem*_*und 5 java spring spring-transactions spring-data-jpa

我想忽略在 spring 删除操作期间发生的任何异常CrudRepository

@Tranactional
public void remove(Long id) {
    try {
        if (id != null) dao.delete(id); //CrudRepository
    } catch (Exception e) {
        //ignore any exceptions, it's not critical delete
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:当我运行它时,我仍然收到以下异常(例如,如果要删除的 id 在数据库中不再存在 - 意味着它可能已被同时删除)。我怎么能无视呢?

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526) ~[spring-orm-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) ~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) ~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485) ~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291) ~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.2.6.RELEASE.jar:4.2.6.RELEASE]
Run Code Online (Sandbox Code Playgroud)

sur*_*a2k -1

@Tranactional(rollbackFor={TableNotFoundException1.class, RecordNotFoundException.class}
public void remove(Long id) {
    try {
        if (id != null) dao.delete(id); //CrudRepository
    } catch (Exception1 e) {
        throw new TableNotFoundException1();
    }catch (Exception2 e) {
        throw new RecordNotFoundException();
    }catch (Exception e) {
        throw new RecordNotFoundException();
    }
}
Run Code Online (Sandbox Code Playgroud)

你必须弄清楚你是如何抓住的Exception1Exception2或者只是使用ExceptionwithrollbackFor={Exception.class}

为什么需要申报rollbackFor?默认情况下,Spring 仅回滚未检查的异常。

其他选项:以下也可以工作,但不使用@Tranactional

//@Tranactional(rollbackFor={TableNotFoundException1.class, RecordNotFoundException.class}
public void remove(Long id) {
    try {
        if (id != null) dao.delete(id); //CrudRepository
    }catch (Exception e) {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}
Run Code Online (Sandbox Code Playgroud)