Violação de restrição do banco de dados não lançando exceção no Hibernate
Eu tenho o seguinte código:
try {
userDAO1.save(userRecord);
userDAO2.save(userRecord);
}
catch(DataIntegrityViolationException e) {
throw new ApplicationException("Contraint violated")
}
userDAO1.save (userRecord) viola uma restrição de integridade - portanto, após a execução do código inteiro, não há nada gravado na tabela a que userDAO1 se refere.
No entanto, a instrução userDAO1.save () não gera um erro / exceção - portanto, userDAO2.save () também é executado.
Mas o DataIntegrityViolationException é capturado e orastreamento de pilha é nulo.
Como verifico de onde a DataIntegrityViolationException é lançada e evito que o userDAO2.save () seja executado se userDAO1.save () viola uma restrição?
Tentei adicionar uma anotação @Transactional em torno desse código, mas isso também não funcionou.
Rastreio de pilha:
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)
O código que eu publiquei está em UpdateUserCommand, que é anotado com@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)