我有以下代碼: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