Catch em ConstraintViolationException no JPA

5 respostas
V

olá galera, meu nome é Vinicius, sou novo aqui e estou enfrentando um erro que gostaria da ajuda de vcs para resolver

Estou trabalhando na migração de um software desenvolvido a 15 anos atras, e ele n trabalha com chave sequencial, o codigo que o usuário digita na tela é a propria PK do banco, tudo bem, dificil usar hj em dia, mas tb n eh errado. n vamos mudar o banco.

Meu problema é o seguinte: quero dar um catch em ContraintViolationException quando usuario digitar um codigo que  existe no banco, mas a excecao que dar ao commitar é RollBackException e nunca ConstraintViolationException, ConstraintViolationException é a causa dessa excecao, eu poderia fazer um instanceof depois que pegar a RollBackException:

if(ex.getCause() instanceof ConstraintViolationException){

throw new CodigoJaExisteException(ex);

}

Funciona, mas n quero, queria dar um catch direto em ConstraintViolationException, alguem já se deparou com esse erro?

Obrigado desde já galera

5 Respostas

paulofafism

Por que vc não faz um consulta buscando o valor máximo da chave primaria e incrementa quando for salvar
Ficaria bem mais fácil do que ficar lançando exception, e evita do usuário ficar digitando o codígo o que não e normal

V

ok, entendi, poderia. Mas esse sistema já existe há muito tempo, funciona assim, o usuário digita o codigo na tela e o código é uma PK, além do mais, agora vem uma coisa mais estranha ainda sobre esse sistema, a PK é alfanúmerico, isso mesmo, alfanúmerico. e isso não vai mudar.

repetindo: ao commitar uma gravacao com o mesmo codigo, cai em RollBackException, é normal?, pq não cai logo em ConstraintViolationException, e assim eu trataria de forma simples.

to usando JPA com Hibernate.

valeu.

paulofafism

O campo alpha númerico do banco e daqueles do tipo 00001, 00002 etc…

Se for dessa forma vc pode fazero seguinte isolar somente a parte numerica como por exemplo do código 00001, vc pegaria o número 1 converteria para inteiro e faz um alto incremento pelo sistema, te falo isso pq ja tive que fazer isso quando programava em delphi e fiz isso tb no java com pequenas aplicações, tinha que usar um banco de dados antigo naverdade esses banco nem merecem o nome banco de dados e sim sistema de armazenamento de arquivos como PARODOX.

Já que vc esta migrando a aplicação para java não teria nenhum problema enquanto a isso , agora se a chave mistura numeros com letras ai e um grande problema.

Uma outra solução seria vc pesquisar antes para ver se o código existe, se existe ele exibiria esse codigo para uqe o usuário digitasse um codigo posterior ou diferenete.

Mas fazendo o autoincremento como te falei deve funcionar melhor, caso o campo alhanumerico armazeno so números

Enquanto ao erro, vc não estaria dando rollback na transação sem comitar?

V

cara, campo alphanumerico armazena letras e numeros.

eu pesquisei mais um pouco sobre a RollBackException. Meu commit quando da algum erro de banco(seja de constraint ou outro qualquer…), está dando rollback sozinho, e a conexao deixa de estar ativa, tanto que se eu tentar dar rollback no catch, emite outro erro dizendo que a conexao nao está ativa.

como se na minha aplicacao estivesse setado pra dar rollback automaticamente. se for isso, eu n sei como seta ou nao seta isso.

valeu

paulofafism

Eu sei muito bem que campo alpha númerico armazena números e letras o que acontece que em sistema de arquivos como PARADOX alguns aplicativos usam o campo alpha númerico para para armazenar somente números, te falo isso pq ja me deparei com vários bancos desse tipo.

Tem como vc postar o código para podermos analizar melhor?

Criado 30 de junho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 5
Participantes 2