我有以下代码:DB约束违反休眠
try {
userDAO1.save(userRecord);
userDAO2.save(userRecord);
}
catch(DataIntegrityViolationException e) {
throw new ApplicationException("Contraint violated")
}
userDAO1.save(userRecord)违反了完整性约束 - 所以整个代码已运行后,没有什么写入表userDAO1引用。
但是,userDAO1.save()语句不会引发错误/异常 - 因此也会执行userDAO2.save()。
但是DataIntegrityViolationException被捕获,并且堆栈跟踪为空。
如何检查DataIntegrityViolationException从何处抛出,并防止在userDAO1.save()违反约束时执行userDAO2.save()?
我试着围绕这段代码添加一个@Transactional注释,但那也没用。
堆栈跟踪:
org.springframework.dao.DataIntegrityViolationException: ORA-00001: unique constraint (UNIQUE_EMAIL) violated
; SQL [n/a]; constraint [UNIQUE_EMAIL]; nested exception is org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (UNIQUE_EMAIL) violated
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:643)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:516)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at com.sun.proxy.$Proxy76.updateUser(Unknown Source)
at com.osiris.UserReg.UpdateUserCommand.execute(UpdateUserCommand.java:63)
我已经发布的代码是UpdateUserCommand,其中标注有@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)
阅读save()或persist()或merge()或在DAO.save()方法中调用的任何内容的javadoc。它不会告诉调用此方法时执行插入查询。我非常怀疑堆栈跟踪为空。添加'e.printStackTrace()'到你的catch块,你会看到它。并在您的ApplicationException中包装DataIntegrityViolationException。 –
与答案无关,但是您是否正在捕获服务层中的DataIntegrityViolationException异常?看看您的代码,看起来您正在这样做。不是一个好主意。服务层与Dao层异常无关。 –
我简化了发布目的的代码 - 有一个单独的业务层。 @Nizet - 我添加了一个printStackStrace(),唯一提到的类是内部的spring类 - 我写的都没有。 – Osiris