Duvida Hibernate
03/03/2010 00:00
0
Tenho um pequeno sistema para controle de dispesas. Uma das funcionalidades é o estorno, onde é gerado uma operação bancaria contraria. Ou seja, eu supostamente deveria gerar um dado na mesma tabela, trocando somente a chave id, e o tipo da operação.
Porem quando tento inserir o novo registro, o hibernate dispara uma org.hibernate.HibernateException: identifier of an instance of MinhaClasse was altered from X to Y


Qual a solução ?
Tags: Grails


0
oi guimoz,

será que você podia postar algum código aqui pra gente dar uma olhada?


0
 def caixaInstance = Caixa.get(params.id)
if (caixaInstance) {
if (params.version) {
def version = params.version.toLong()
if (caixaInstance.version > version) {

caixaInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'caixa.label', default: 'Caixa')] as Object[], "Another user has updated this Caixa while you were editing")
render(view: "edit", model: [caixaInstance: caixaInstance])
return
}
}
caixaInstance.properties = params

if(params.tipoDoCaixa == 'E'){
caixaInstance.tipoDoCaixa = 'S'
}else {
caixaInstance.tipoDoCaixa = 'E'
}
caixaInstance.id = 0
caixaInstance.save()


03/03/2010 00:00


0
Acredito que o problema seja o seguinte: o GORM trabalha por padrão com a estratégia de lock otimsita.
Nesta estratégia, o ORM "acredita" que seja raríssimo a ocorrência de situações nas quais o mesmo registro seja editado por dois registros concorrentes.

Então, é criado o campo version na base de dados e o atributo relacionado na sua classe de domínio. Sendo ssim, no momento em que você manda persistir o registro, o GORM verifica se o valor do campo version presente no banco de dados e na sua classe de domínio está diferente.
Se estiver, vai disparar esta excessão.

Solução: na hora de persistir, passe o parâmetro flush:true para o método save. Ou então simplesmente desabilite o lock otimista no GORM.


0
[quote="kicolobo"]Acredito que o problema seja o seguinte: o GORM trabalha por padrão com a estratégia de lock otimsita.
Nesta estratégia, o ORM "acredita" que seja raríssimo a ocorrência de situações nas quais o mesmo registro seja editado por dois registros concorrentes.

Então, é criado o campo version na base de dados e o atributo relacionado na sua classe de domínio. Sendo ssim, no momento em que você manda persistir o registro, o GORM verifica se o valor do campo version presente no banco de dados e na sua classe de domínio está diferente.
Se estiver, vai disparar esta excessão.

Solução: na hora de persistir, passe o parâmetro flush:true para o método save. Ou então simplesmente desabilite o lock otimista no GORM.[/quote]


Desabilitar o lock otimista no gorm, seria o mesmo que setar o atributo version para false, no mapping do domain ?
03/03/2010 00:00


0
???
03/03/2010 00:00


0
[quote="guimoz"]

Desabilitar o lock otimista no gorm, seria o mesmo que setar o atributo version para false, no mapping do domain ?[/quote]

oi guimoz, me desculpe não te responder na hora. Infelizmente só posso colaborar na medida do possível.
Sim, basta isto.


0
Não acredito que seja este o problema, pois o lock ja está desabilitado.

Tenho algumas duividas, por exemplo..
Considerando a entidade caixa, pq quando estou dentro do metodo para efetuar o update da entidade (def update = {...}) não posso efetuar, além do update, por exemplo um insert ?

Existe alguma maneira de encadear outra action, de forma que após a ocorrencia do update possa ser feito um insert automaticamente ?
03/03/2010 00:00


0
Dentro da action você pode fazer o que quiser. O nome é apenas uma convenção. O que pode te trazer algum problema é se tentar incluir um registro e alguma dependência dele não tiver sido persistida anteriormente.

Lembre-se de que este código é gerado pelo scaffolding para que você o customize caso seja necessário. Não necessáriamente seu conteúdo precisa ser o que está presente dentro do método.

Agora, óbviamente, isto depende do caso e da situação né?


0
Ok, parece que a minha bronca é com o hibernate. O que eu preciso fazer é atualizar um registro, e criar outro registro exatamente igual ao que foi atualizado, porem com 1 ou 2 campos com dados diferentes. Não estou conseguindo inserir o novo registro.
03/03/2010 00:00



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