Problema com Try-Catch (DataIntegrityViolationException)
29/04/2013 13:53
0
Estou desenvolvendo um CRUD simples, e em meu método update estou tendo o seguinte problema:

Situação:
No banco tenho uma tabela com 4 colunas (fora a chave primária) e uma unique constraint para 3 dessas colunas.

O problema se da quando o usuario tenta atualizar a linha de forma que viole o constraint unica.

--------------------------------------------------------
O que fiz como solução:

O tratamento do erro é feito no próprio banco, então a primeira coisa que tentei foi dar um catch em "DataIntegrityViolationException". Segue trecho:

try {
if(!objeto.hasErrors() && objeto.save(flush : true) ) {
flash.message = "objeto atualizada com sucesso"
redirect(action:show,id:objeto.id)
}
} catch(org.springframework.dao.DataIntegrityViolationException e) {
msgError += '<li>Registro existente na base de dados.</li>'
request.error = '<ul>'+msgError+'</ul>';
render(view:'update',model:[objeto:objeto],params:params)
return
}

Resultado:

Mensagem: could not update: [Rota#102428]
Causado Por: could not update: [Rota#102428]; nested exception is org.hibernate.exception.ConstraintViolationException: could not update: [Objeto#102428]
Classe: Unknown
Na Linha: [-1]

------------------------------------------------------------------------------------
Ok... ai la fui eu tentar capturar o erro do hibernate então:

try {
if(!objeto.hasErrors() && objeto.save(flush : true) ) {
flash.message = "objeto atualizada com sucesso"
redirect(action:show,id:objeto.id)
}
} catch(org.hibernate.exception.ConstraintViolationException e) {
msgError += '<li>Registro existente na base de dados.</li>'
request.error = '<ul>'+msgError+'</ul>';
render(view:'update',model:[objeto:objeto],params:params)
return
}

Resultado:

Mensagem: could not update: [Rota#102428]; nested exception is org.hibernate.exception.ConstraintViolationException: could not update: [Objeto#102428]
Causado Por: org.springframework.dao.DataIntegrityViolationException: could not update: [Rota#102428]; nested exception is org.hibernate.exception.ConstraintViolationException: could not update: [Objeto#102428]
Classe: Unknown
Na Linha: [-1]

---------------------------------------------------------------------------------
Já sem entender e após falhar buscando informações no Google de forma geral, tentei capturar a exception pura:

try {
if(!objeto.hasErrors() && objeto.save(flush : true) ) {
flash.message = "objeto atualizada com sucesso"
redirect(action:show,id:objeto.id)
}
} catch(Exception e) {
msgError += '<li>Registro existente na base de dados.</li>'
request.error = '<ul>'+msgError+'</ul>';
render(view:'update',model:[objeto:objeto],params:params)
return
}

Resultado:

Mensagem: could not update: [Objeto#102428]
Causado Por: could not update: [Objeto#102428]; nested exception is org.hibernate.exception.ConstraintViolationException: could not update: [Objeto#102428]
Classe: Unknown

------------------------------------------------------------------------------
Então, sou bem cru no grails ainda, mas de fato estou sem saber o porque de meu erro.
Quando o update não viola a constraint o mesmo funciona perfeitamente. Para o create, utilizo o mesmo código (o primeiro caso que postei), e o mesmo funciona perfeitamente.

Tem idéia do que pode ser?
Tags: exception, spring, hibernate, update, try, catch, erro, sql, banco, persistência, constraint


0
Onde esta a palavra Rota, troquem por Objeto... o original era Rota, substitui o nome para não aparecer o nome original da coluna (código da empresa), mas o que passou acabei não vendo e não possui problemas estar ali.
29/04/2013 13:55



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto