Tenho um atributo anotado como Unique. Quando tento incluir um registro na tabela que viola essa constraint, recebo a seguinte exception:
org.hibernate.exception.ConstraintViolationException: could not execute statement
Já tentei catching em ConstraintViolationException, RollbackException, PersistenceException e nada. Não consigo capturar.
Como devo fazer? Deixar dar a exception e tratar ou verificar antes se a constraint é violada?
Resolvi a minha necessidade, não sei se é a melhor forma mas deixo como fiz. Pode ajudar a alguem.
Pelo que pude entender pelas pesquisas que fiz na internet, o JPA embrulha as exceções em uma PersistenceException.
Dessa forma, no Spring e no controle global de exceções, desembrulhei as exceções. Durante o processo de desembrulhar eu verifico se é uma ConstraintViolationException, se for, faço um casting para poder pegar o retorno do método getConstrainName.
@ExceptionHandler(value = PersistenceException.class)
protected ResponseEntity handlePersistenceException(PersistenceException ex, WebRequest request){
for (Throwable t = ex.getCause(); t != null; t = t.getCause()) {
if(t instanceof ConstraintViolationException){
ConstraintViolationException s = (ConstraintViolationException) t;
return handleExceptionInternal(ex, "Verifique o campo ["+s.getConstraintName()+"]. Este campo pode ser inválido ou já estar em uso.", new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}
return handleExceptionInternal(ex, ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT, request);
}