Olá amigos! gostaria de saber como faço para capturar exceções causadas por violação às restrições de integridade do banco no Hibernate ou JPA, por exemplo:
quando tento persistir um objeto Pessoa que tem um atributo cpf único que já existe no banco recebo uma exceção. Como tratá-la de forma que possa identificar exatamente que tipo de restrição foi violada, para então informá-la ao usuário?
no commit da Transaction, vc pega o metodo getMessage() da Exception
Amigo,
Você pode capturar a exceção: ConstraintViolationException.
Esta exceção é lançada pelo Hibernate quando ocorre uma violação de constraint. Ou seja, um insert de um id que já existe, um campo unique, etc…
Uma outra forma de identificar se já existe o campo é verificar, antes de fazer o insert, se o CPF já está cadastrado. Você perde desempenho mas sua mensagem pode ser mais específica.
Abraço.
Amigos, obrigado, pelas respostas! Tinha pensado em fazer uma consulta antes do insert, mas quando há vários atributos unique pode ficar muito trabalhoso. Imaginei que houvesse uma outra maneira. O que acha de fazer as consultas somente no caso de se capturar uma ConstraintViolationException, pelo menos as mesmas não seriam necessárias nos casos de sucesso.