Olá venho por meio deste mais uma vez abrir um tópico para a anotação @Transactional, o projeto utiliza Hibernate + Spring. O projeto possui Persistencia Generica, o problema começou quando resolvi colocar a anotação @Transactional no negocio levando em conta que preciso fazer várias transações em apenas 1 método então preciso do rollback caso aconteça QUALQUER exception. Só que ao contrário do que eu imaginava o projeto simplesmente parou de capturar as exceptions enviando a exeption para a view, segue abaixo o codigo do método do negócio:
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor={Exception.class, DataIntegrityViolationException.class, ConstraintViolationException.class})
public ArrayList<?> salvar(Cidade e) {
try {
objDao.salvar(e);
arrRet = new ArrayList();
arrRet.add(0, 1);
arrRet.add(1, Mensagens.getMensagem(1));
return arrRet;
} catch (Exception ex) {
return TrataException.TratarException(ex);
}
}
Segue abaixo o codigo da persistencia generica
public synchronized E salvar(E entity) throws Exception, DataIntegrityViolationException, ConstraintViolationException {
if (!getEntityManager().contains(entity))
entity = getEntityManager().merge(entity);
getEntityManager().persist(entity);
return entity;
}
Bem simples né… eu gostaria de saber se é possivel tratar qualquer exeption que aconteça… Pelo o que da para ver a transação fica aberta até o return, quando ele executa o return ele vai fechar a transação e os possíveis commits, então se der exeption é tratada pela camada de cima, então ja até averiguei de fazer mais uma camada so para poder tratar a exeption. Me deem uma luz por favor. segue abaixo a exeption que vai para o cliente
org.springframework.dao.DataIntegrityViolationException : Could not execute JDBC batch update; SQL [insert into public.cidade (cida_nome, cida_uf, empe_id, usua_id, cida_id) values (?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
A propósito, esta exeption é gerada por que o campo cida_nome é unique no banco, então estou tentando cadastrar uma cidade que ja existe no banco. Fico no aguardo pessoal. Muito obrigado