Erro ViolationException
01/05/2012 19:19
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,


0
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.


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


0
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?

02/05/2012 14:11


0
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.
02/05/2012 18:20


1
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?


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


1
Ah e pra fazer o "clean" é só invocar o comando "clean" mesmo, sem parâmetro algum.


0
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
03/05/2012 14:56



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