Erro ViolationException
Postado em 01/05/2012 19:19
0
0
Por Diversas vezes no desenvolver do projeto em Grails, quando trabalho com constraints me deparo com um problema. Seto uma constraint como nullable: false ou true mandando rodar o projeto, gera as tabelas no Banco de Dados com tais restrições. O problema ocorre quando altero estas restrições e no Banco parece não atualizar com a nova regra.

O erro é semelhante a este abaixo:

"org.springframework.dao.DataIntegrityViolationException: could not insert: [projeto.Dominio]; SQL [insert into dominio(version, param1, param2) values (?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [projeto.Dominio]"

Para resolvê-lo eu sempre excluo a tabela e mando rodar o projeto novamente que recria a tabela com a nova regra. Quando excluir a tabela não funciona o jeito é excluir o banco e rodar o projeto para refazer tudo novamente e já imagina o transtorno que é fazer isso né?

Alguém sabe como resolver isso sem a necessidade de excluir todo o banco ou a tabela?
Tags: erro, Banco,
ivgsilva
Pontos: 182






0
0
01/05/2012 23:59
Olá. Amigo, penso em 2 verificações:
1. tem certeza que exclui a constaint no banco com a aplicação parada?
2. fez o "clean" do Grails depois de alterar a classse GORM e com a aplicação parada?

Espero ter ajudado.

José Yoshiriro (Yoshi)
Pontos: 1107



0
0
02/05/2012 11:52
por acaso você adicionou novos campos apos o banco já conter dados?

manthay
Pontos: 186



0
0
02/05/2012 14:11
Ola José,

1. eu apenas alterei a constraint no Dominio. Não trabalhei a nivel do Banco de Dados
2. Eu nao fiz o "clean" no Grails. Poderia me explicar como eu faço isso?



Ola Manthay,

adicionei outros campos sim, mas os que apresentaram problemas foram os que possuiram suas constraints alteradas. Saberia como posso resolver isso?


ivgsilva
Pontos: 182



0
0
02/05/2012 18:20
como eu geralmente trabalho na base de teste eu excluo o banco e crio denovo ou seto falo que o valor pode ser nulo nas colunas que estao dando problema.

manthay
Pontos: 186



1
0
03/05/2012 12:41
Amigo, quando você coloca coisas NOVAS na classe GORM, o Hibernate atualiza a base (exemplo: colocar uma restrição que não existia em certo campo).

MAS, quando você faz o contrário, quanto TIRA algo da classe, o Hibernate não tira isso da tabela.

Exemplo:
T1 - cria uma classe GORM com 3 campos sem restrições e executa a aplicação
T2 - o Hibernate cria a tabela com esses campos
T3 - inclui novo campo na classe GORM e executa novamente a aplicação
T4 - o Hibernate inclui o novo campo na tabela
T5 - exclui o campo incluido em T3 na classe GORM e executa novamente a aplicação
T6 - o Hibernate não faz absolutamente nenhuma alteração na tabela

E o mesmo vale para criação de constraints, entendeu?


Por isso não é necessário apagar toda a base e sim retirar manualmente da tabela o que retirou da classe GORM, entendeu?

José Yoshiriro (Yoshi)
Pontos: 1107



1
0
03/05/2012 13:25
realmente o José esta certo, acabei me expressando mal você pode sim retirar manualmente já fiz isso :)

manthay
Pontos: 186



1
0
03/05/2012 14:19
Ah e pra fazer o "clean" é só invocar o comando "clean" mesmo, sem parâmetro algum.

José Yoshiriro (Yoshi)
Pontos: 1107



0
0
03/05/2012 14:56
José e manthay,

vocês não sabem o quanto me ajudou ver suas explicações. Obrigado mesmo pela sua paciência.

Todas as vezes que dava errado eu excluía a base e dava todo o trabalho de repor alguns dados.

Valeu mesmo... grande abraço

ivgsilva
Pontos: 182



 


Esqueceu sua senha?
 
Grails Brasil é mantido por itexto Desenvolvimento de Projetos Ltda.
Em caso de problemas, sinta-se livre para procurar Henrique Lobo Weissmann (Kico) por e-mail: kicolobo@itexto.net
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão (clique no logo à direita para maiores detalhes)