Ajuda para entender melhor o GORM
06/08/2012 19:27
0
Olá amigos eu tenho 4 domains que criei, sendo banco, boleto, cheque e tipoCobranca.
minhas classes:



class Banco {
String numero
String agencia
String nome

static hasOne = [boleto:Boleto,cheque:Cheque]

static constraints = {

}
}

class Cheque {
Banco banco
String nominal
int quantidade
static belongsTo = [banco:Banco]
static constraints = {

}
}

class Boleto {
Banco banco
TipoCobranca tipo
String descricao
static belongsTo = [banco:Banco]
static constraints = {
}
}

class TipoCobranca {

String nome

static belongsToo = [boleto:Boleto]

static constraints = {
}
}



A classe tipo cobranca só foi gerada para ter alguns valores fixo e é chamada po uma lista.
O problema esta no seguinte fato: Meu controller nao esta salvando o campo tipo qdo esta referenciado como um objeto agora se eu mudar na domain boleto para string salva normalmente. Agora Como fazer para salvar como esta lá?
minha controller:

def banco = Banco.get(params.id)

if (!banco) {
if (!banco) {
banco = new Banco(params)
banco.boleto = new Boleto(tipo:params.tipo,descricao:params.descricao)
banco.cheque = new Cheque(nominal:params.nominal,quantidade:params.quantidade)
banco.save(flush:true)
} else {
banco.properties = params
banco.merge()
result.mensagem = 'Cadastro atualizado'
}
if (!banco.save()) {
banco.errors.each {
println it
}
}
}

Amigos ja li diversos tutoriais mas nao consegui, espero obter alguma luz :) agradeço desde já qq dica :)
Tags: gorm, objetos, relacionamento, save


0
Todos os params são strings, se você passa para um parâmetro que requer um objeto apenas params.tipo vai dar errado porque ele está esperando um TipoCobranca e você passou um String.


banco = new Banco(params)
def tipoCob = TipoCobranca.findByNome(params.tipo)
banco.boleto = new Boleto(tipo:tipoCob,descricao:params.descricao)
banco.cheque = new Cheque(nominal:params.nominal,quantidade:params.quantidade)
banco.save(flush:true)


Outra coisa Silas dizer que um Banco tem um boleto e tem um cheque está certo ? é isso mesmo ?
06/08/2012 20:00


1
Pedro Henrique, é importante lembrar que o objeto params tem alguns métodos utilitários bastante úteis que já fazem a conversão de tipo para o programador.

Abaixo estão alguns exemplos:


long valor_longo = params.long('parametro_longo')
int valor_inteiro = params.int('parametro_inteiro')
def lista = params.list('lista')



O terceiro é particularmente interessante: caso mais de um input com mesmo nome seja passado, ele vai te retornar uma lista de strings contendo todos os valores que foram recebidos.


0
Blza, realmente ;-)
06/08/2012 20:08


0
Opa pedro sim tem sim, o banco tem boleto e cheque como filhos, relacionamento hasOne, eu to procurando enteder o lance do gorm mas graças a ajuda de voces to conseguindo, ja li os materiais que passaram mas sei que aqui posso contar com boas dicas. :)

agora ja mudou rssss ta dando esse erro agora: grails.validation.ValidationErrors: 1 errors
Field error in object 'Cadastro.Banco' on field 'boleto.tipo': rejected value [null];

lembrando que minha tabela TipoCobranca ja tera valores no banco de dados, ja populei manualmente com dois valores: simples e normal.
06/08/2012 20:39


0
A pergunta é porque hasOne tem só 1, hasMany um ou vários.
06/08/2012 20:52


0
ah ta essa parte eu entendo mas o caso é que o banco tera um boleto e um cheque então defini has dessa forma:

class Banco {
String numero
String agencia
String nome

static hasOne = [boleto:Boleto,cheque:Cheque]

static constraints = {

}
}


o unico problema é salvar o tipo cobrança que ainda nao ta dando certo na tabela boleto, mas estamos no caminho, ^^
06/08/2012 20:58


0
Gente help rsss agora ta dando esse erro e ja fiz de tudo pesquisei li os gotchas etc e nada:
Field error in object 'Cadastro.Banco' on field 'boleto.tipo': rejected value [null]; codes [Cadastro.Boleto.tipo.nullable.error.Cadastro.Banco.boleto.tipo,Cadastro.Boleto.tipo.nullable.error.boleto.tipo,Cadastro.Boleto.tipo.nullable.error.tipo,Cadastro.Boleto.tipo.nullable.error.Cadastro.TipoCobranca,Cadastro.Boleto.tipo.nullable.error,boleto.tipo.nullable.error.Cadastro.Banco.boleto.tipo,boleto.tipo.nullable.error.boleto.tipo,boleto.tipo.nullable.error.tipo,boleto.tipo.nullable.error.Cadastro.TipoCobranca,boleto.tipo.nullable.error,Cadastro.Boleto.tipo.nullable.Cadastro.Banco.boleto.tipo,Cadastro.Boleto.tipo.nullable.boleto.tipo,Cadastro.Boleto.tipo.nullable.tipo,Cadastro.Boleto.tipo.nullable.Cadastro.TipoCobranca,Cadastro.Boleto.tipo.nullable,boleto.tipo.nullable.Cadastro.Banco.boleto.tipo,boleto.tipo.nullable.boleto.tipo,boleto.tipo.nullable.tipo,boleto.tipo.nullable.Cadastro.TipoCobranca,boleto.tipo.nullable,nullable.Cadastro.Banco.boleto.tipo,nullable.boleto.tipo,nullable.tipo,nullable.Cadastro.TipoCobranca,nullable]; arguments [tipo,class Cadastro.Boleto]; default message [O campo [{0}] da classe [{1}] não pode ser vazia]

Alguém pode dar uma dica? obrigado
07/08/2012 00:32


0
Basicamente, está dizendo que você está tentando salvar o objeto Boleto com null no campo tipo, o que você está passando no tipo ?
07/08/2012 02:41


0
Fala Pedro blz? amigo obrigado pela dica valeu muito mesmo, nao deu certo do jeito que vc me passou mas passou a funcionar qdo usei parte do seu codigo:

codigo anterior:
def tipoCob = TipoCobranca.findByNome(params.tipo)
banco.boleto = new Boleto(tipo:tipoCob,descricao:params.descricao)


modificado:
def tipoCob = TipoCobranca.gete(params.tipo)
banco.boleto = new Boleto(tipo:tipoCob,descricao:params.descricao)


Dessa forma funcionou sim, não sei se é da forma correta :)

Esse exemplo foi pra resolver uma questao de um priojeto bem maior, mas ai percebi que o gorm vai muito mais além disso, com maps etc :) mas se prepare que qdo a duvida pintar vou te chamar rsss obrigado de novo ^^
07/08/2012 21:59


0
Valeu Silas, olha o get() funciona perfeitamente, quando a gente tem que localizar um objeto por id.
08/08/2012 00:28



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