Exceções Hibernate

Galera…

Preciso de uma ajuda no tratamento de exceções do hibernate.

Por exemplo:

Tenho uma classe de Usuário onde ela tem os atributos id, nome, login e senha.

O login é uma chave unica e, caso eu tente persistir um objeto com o mesmo login, ele me dará a mensagem de erro de registro duplicado.

Como eu faria para tratar essa exceção de acordo com o atributo que está apresentando a duplicidade?

Pretendo apresentar para o usuário somente uma mensagem de erro referente aos atributos que estão duplicados na sua inclusão. É possível fazer isso sem ter que realizar uma consulta prévia no banco?

A exceção que o hibernate apresenta é ConstraintViolationException porém ela é muito vaga. Caso o login e o cpf, por exemplo, estejam duplicados, como poderei apresentar os dois erros separadamente ao usuário?

Obrigado desde já :slight_smile:

Tentou fazer um try/catch na exception que ele joga?

Sim. Mas a exceção é sempre a mesma, independente da coluna que esteja duplicada.
Assim não teria como mensurar. Meu objetivo é informar ao usuário tipo: “Este login já está em uso” ou “Este cpf já está cadastrado”.

Como a exceção é sempre a mesma, não tenho como mensurar.

A exceção completa é essa Caused by: org.hibernate.exception.ConstraintViolationException: Duplicate entry ‘admin’ for key 3

Essa foi uma tentativa de incluir o login admin novamente.

A única alternativa seria utilizar a key que ele apresenta no final, nesse caso a 3.

Mas eu não sei como mensurar isso no try/catch pra tratar. Há alguma maneira de pegar a coluna em que ocorreu a exceção?

Herbert,

Obrigado pela ajuda. Acho que encontrei uma solução.

Toda vez que tem uma exceção, o ultimo caractere exibido na mensage de erro é a key.
Então, eu fiz o seguinte:

try { usuario.incUsuario(); } catch(Exception e) { JOptionPane.showMessageDialog(null,e.getMessage().toString().charAt(e.getMessage().length()-1)); }

Assim eu consegui saber qual a key que houve o erro. Ja é um começo. Só tenho que ver como farei para tratar os outros erros, mas isso da pra ver depois.

Vlw :slight_smile:

Amigo, isso está acontecendo porque o ‘id’ 3 já está cadastrado. Se você colocasse o id 4 iria normal.

O que te aconselho, caso nao tenha importância é: tirar o campo id na tela e deixar o hibernate gera-lo sozinho. Dessa maneira, os campos não serão duplicados.

Outra coisa, vamos supor que você não queira deixar dois logins ‘admins’ iguais. Ai você terá que definir essa coluna como primary key.

Porém, o que deve ser pensado também é que cadastrar um usuário não é tao essencial quanto cadastrar um cliente. Clientes ocorrem bem mais erros do que usuário. Vamos supor que seja um software comercial isso ai. A empresa pode ter 3 usuários, mas ela tem 5 mil clientes. Caso der algum erro, ela te contata e você dá o suporte a ela.

As vezes coisinhas simples assim, procuramos ir pelo caminho mais difícil, como o código que você fez rsrsrs

Abraços

[quote=Gleidson Henrique]Amigo, isso está acontecendo porque o ‘id’ 3 já está cadastrado. Se você colocasse o id 4 iria normal.

O que te aconselho, caso nao tenha importância é: tirar o campo id na tela e deixar o hibernate gera-lo sozinho. Dessa maneira, os campos não serão duplicados.

Outra coisa, vamos supor que você não queira deixar dois logins ‘admins’ iguais. Ai você terá que definir essa coluna como primary key.

Porém, o que deve ser pensado também é que cadastrar um usuário não é tao essencial quanto cadastrar um cliente. Clientes ocorrem bem mais erros do que usuário. Vamos supor que seja um software comercial isso ai. A empresa pode ter 3 usuários, mas ela tem 5 mil clientes. Caso der algum erro, ela te contata e você dá o suporte a ela.

As vezes coisinhas simples assim, procuramos ir pelo caminho mais difícil, como o código que você fez rsrsrs

Abraços[/quote]

Sim, sim. Entendi o que tu quis dizer.
Mas não foi isso que eu perguntei. A minha duvida era no tratamento da exceção. A minha key 3, nesse caso, é a coluna de login no meu DB.
Ela é uma Unique Key, e por esse motivo, não se repete. Mas, no momento que o usuário tentar cadastrar um login que já exista no DB, eu quero apresentar uma mensagem de erro para ele informando que aquele login ja está em uso, ou um CPF já está cadastrado, ou uma matrícula também ja está cadastrada. Como a exceção gerada pelo hibernate não é diferente para cada coluna, eu não teria como trata-la separadamente. O código que postei foi uma solução para saber em qual coluna do DB houve a exceção de duplicidade e, utilizando essa informação, poderei tratar separadamente cada exceção.

Mas obrigado pela resposta :slight_smile:

Amigo, isso pra mim é um caso típico em utilizar Hibernate Validator (ou se quiser utilizar a especificação, Bean Validation). Assim, você define via anotações as constraints de cada atributo e ainda por cima definir a mensagem de erro.