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)
你必须弄清楚你是如何抓住的Exception1,Exception2或者只是使用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)
| 归档时间: |
|
| 查看次数: |
4256 次 |
| 最近记录: |