gpt4 book ai didi

java - 如果数据库 ID 不再存在,如何忽略删除时的异常?

转载 作者:搜寻专家 更新时间:2023-11-01 03:48:07 26 4
gpt4 key购买 nike

我想忽略在 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
}
}

问题:当我运行它时,我仍然收到以下异常(例如,如果要删除的 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]

最佳答案

即使您捕获了异常,事务管理器也会将事务标记为只回滚,因此当您在方法结束时提交时,您将遇到一个 TransactionSystemException 异常。

第一个 react 是标记方法 @Transactional(noRollbackFor=EmptyResultDataAccessException.class) 但这并不能解决问题,因为如果你看一下 SimpleJpaRepository 类将看到 delete 方法被标记为 transactional,因此当抛出异常时,此 @Transactional 将您的事务标记为仅回滚。

在我看来,解决方案是调用 findOne 方法,然后如果实体存在则调用 delete 方法(按实体而不是按 ID 调用 delete 方法):

@Tranactional
public void remove(Long id) {
if (id != null) {
YouEntity entity= dao.findOne(id);
if (nonNull(entity)) {
dao.delete(entity);
}
}
}

关于java - 如果数据库 ID 不再存在,如何忽略删除时的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37834206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com