BeforeInser recursivo por conta de uma pesquisa
07/03/2014 21:00
0
Tenho uma classe de Contrato e uma Classe onde cadastro as equivalencias entre as unidades, exemplo Saco de 60Kg equivale a 60 Kg onde o fator é 60, ao gravar um contrato tenho que calcular o valor pela unidade de valor para isso tenho que fazer a equivalência, porém ao tentar faze-la dá um StackOverflow coloquei um log no BeforeInsert onde pude ver justamente isso que ele repete recursivamente o BeforeInsert, para mim não faz sentido, uma find gerar uma recursividade de BeforeInsert, alguém poderia me ajudar ?


class Contrato {
Exercicio exercicio
String numeroContrato
Unidade unidade
Unidade unidadeValor
BigDecimal quantidade
BigDecimal senar
BigDecimal total

def beforeInsert() {
log.info "beforeInsert ${numeroContrato}"

def quantidadeValor = quantidadeUnidadeValor()
total = quantidadeValor?.multiply(valorUnitario)?.setScale(4)
senar = total?.multiply(0.0020)

}

def getQuantidadeUnidadeValor() {
if (this.unidade && this.unidadeValor){
def equivalencia = EquivalenciaUnidade.findByUnidadeOrigemAndUnidadeDestino(this.unidadeValor, this.unidade)
log.info "quantidadeUnidadeValor ${numeroContrato}"
equivalencia?.calcular(this.quantidade)
}
else{
0.0
}

}


}
Tags: BeforeInsert


1
Acredito que o problema não esta no find pois o find não dispara o beforeInserte.
Porem se você instanciar um objeto no grails e não usar o grails tenta salvar automaticamente.
Se estiver no serviço e der um Casa.findByName('casa1') depois usar casa.name = 'casa2' e sair do serviço sem fazer nada ele vai tentar salvar o objeto.

Valida se no seu caso ocorre isso e coloca um save ou um discard .


0
Carlos, obrigado pela atenção, mas isso deveria acontecer no fim do evento não é (não li o fonte do gorm)? Mas a recursão acontece no inicio ao chamar getQuantidadeUnidadeValor(), eu fiz o seguinte gerei um novo projeto, pois este vinha de atualização de versão do grails e coloquei tudo, dei um 'grails clean' e coloquei para rodar e voilá, tudo rodando rs.

Vou dar uma migrada dos testes de easyB para Spock e ver se realmente está tudo ok.

[]'s
10/03/2014 19:46


0
Pedro,

tenta usar beforeValidate() ao invés do beforeInsert(), com o mesmo conteúdo.



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