Salvar Lista de Objetos
10/09/2009 00:00
0
Amigos,

No Grails é possível salvar uma lista de objetos de uma unica vez??? Por exemplo, tenho uma classe pessoa que possui vários documentopessoa, gostaria de add a lista de documentos à pessoa e salvar a lista, sem precisar fazer um iteração e salvar uma por uma.
Outra coisa, poderia salvar apenas pessoa e automaticamente salvar os objetos relacionados? Assim como no ruby on rails
Tags: Grails


0
Sim, é possível.
Basta mandar persistir a classe que possua a lista como um dos seus atributos. Se esta lista estiver mapeada em uma relação hasMany, o próprio GORM irá salvar todos os itens da lista sem que você precise ficar iterando sobre a mesma.


0
Q bom, tem como colocar um exemplo disso?

Desde já agradeço a atençao e colaboração.
14/09/2009 00:00


0
[quote="ronny"]Q bom, tem como colocar um exemplo disso?

Desde já agradeço a atençao e colaboração.[/quote]
Segue um exemplo tosco:


class Pessoa {
// varios campos
static hasMany = [telefone:Telefone]
}

class Telefone {
String numero
static belongsTo = [pessoa:Pessoa]
}


Salvar seria simples. Por incrível que pareça, só isto:


def pessoa = Pessoa.get(1) // pego a pessoa de id 1. Imagine que ela já tenha uma listagem de telefones.
pessoa.save(); // matou seu problema ;)


0
Valeu!

Ah, só p ser um pouco mais chato...como adiciono um objeto telefone a lista de telefones de Pessoa?
14/09/2009 00:00


0
[quote="ronny"]Valeu!

Ah, só p ser um pouco mais chato...como adiciono um objeto telefone a lista de telefones de Pessoa?[/quote]

simples assim:


pessoa.telefones.add(instancia_de_telefone)


0
Vendo o código, tive outra dúvida:

É possível salvar td de uma vez, sem precisar criar pessoa antes e depois criar os telefones


def pessoa = new Pessoa()
pessoa.telefones.add(instancia_de_telefone)
pessoa.save(); // matou seu problema ;)


Abraços
14/09/2009 00:00


0
[quote="ronny"]Vendo o código, tive outra dúvida:

É possível salvar td de uma vez, sem precisar criar pessoa antes e depois criar os telefones

Abraços[/quote]

explica isto ai melhor


0
Acho que é isso:


pessoa = Pessoa.get(1) //Ou seja, já tenho uma pessoa persistida
pessoa.telefones.add(instancia_de_telefone) //Estou adionando objetos a uma pessoa já cadastrada no banco
pessoa.save() //Update em pessoa e insert em telefones




pessoa = new Pessoa() //pessoa ainda não está persistida
pessoa.telefones.add(instancia_de_telefone) //Estou adionando objetos a uma pessoa que não já cadastrada no banco
pessoa.save() //Insert em pessoa e insert em telefones
14/09/2009 00:00


0
[quote="ronny"]Acho que é isso:


pessoa = Pessoa.get(1) //Ou seja, já tenho uma pessoa persistida
pessoa.telefones.add(instancia_de_telefone) //Estou adionando objetos a uma pessoa já cadastrada no banco
pessoa.save() //Update em pessoa e insert em telefones




pessoa = new Pessoa() //pessoa ainda não está persistida
pessoa.telefones.add(instancia_de_telefone) //Estou adionando objetos a uma pessoa que não já cadastrada no banco
pessoa.save() //Insert em pessoa e insert em telefones
[/quote]

Entendi.

Esta linha que inclui "pessoa.telefones.add(..." foi só pra te mostrar como incluir itens dentro desta lista.
Não precisa fazer isto que eu fiz, ok?

Te entendi direito agora? <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->


0
Seguinte Kicolobo, tenho as seguintes classes:


class Pessoa
{
String nome

static hasMany = [documentos&#58;DocumentoPessoa]

static constraints =
{
nome(blank&#58;false, nullable&#58; false)
}

String toString()
{
&quot;${nome}&quot;
}
}



class Aluno
{
Pessoa pessoa
Date dataNascimento

static belongsTo = [pessoa &#58; Pessoa]
}



class DocumentoPessoa
{
Pessoa pessoa
String numero
TipoDocumentoPessoa tipoDocumentoPessoa

static constraints =
{
numero(blank&#58;true,nullable&#58;false,unique&#58;true)
pessoa(nullable&#58;false)
tipoDocumentoPessoa(nullable&#58;false)
}

String toString()
{
&quot;${tipoDocumentoPessoa}&quot;+ &quot; - &quot;+&quot;${numero}&quot;
}
}


Quero fazer apenas um tela, a de Cadastrar Aluno, sendo assim, quando eu digitar os dados e clicar em cadastrar, devo inserir pessoa, documentos e aluno de uma única vez no metodo save de AlunoController. Porém só consigo fazer isso persistindo primeiro pessoa e depois documentos e aluno.
Gostaria de fazer apenas um save(), no objeto de aluno e automaticamente inserir em pessoa e documentos, conforme segue:


def save =
{
Aluno.withTransaction
{status ->
def alunoInstance = new Aluno(params)
def pessoaInstance = new Pessoa()
pessoaInstance.nome = params.nome
alunoInstance.pessoa = pessoaInstance //passa pessoa para aluno
def cpf = new DocumentoPessoa()
cpf.numero = params.cpf
cpf.pessoa = pessoaInstance //passa pessoa para cpf
cpf.tipoDocumentoPessoa = TipoDocumentoPessoa.get(62) //pega p tipo cpf
def rg = new DocumentoPessoa()
rg.numero = params.rg
rg.pessoa = pessoaInstance //passa pessoa para cpf
rg.tipoDocumentoPessoa = TipoDocumentoPessoa.get(63) //pega p tipo cpf
pessoaInstance.documentos.add(rg)
pessoaInstance.documentos.add(cpf)
if (!alunoInstance.hasErrors() &amp;&amp; alunoInstance.save(flush&#58;true))
{
flash.message = &quot;Aluno ${params.id} updated&quot;
redirect(action&#58;show,id&#58;alunoInstance.id)
}
}
}


Porem aparece o seguinte erro:

org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: Aluno.pessoa; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: Aluno.pessoa
14/09/2009 00:00


0
tenta isso:
(...)
pessoaInstance.documentos.add(cpf)
alunoInstance.pessoa.save()
if (!alunoInstance.hasErrors() &amp;&amp; alunoInstance.save(flush:true))
(...)
14/09/2009 00:00


0
Raphael,

Primeiro agradeço pelo a atenção, essa dica q vc me deu funcionou perfeitamente:

alunoInstance.pessoa.save()
if (!alunoInstance.hasErrors() &amp;&amp; alunoInstance.save(flush&#58;true))
{
flash.message = &quot;Operação realizada com sucesso!&quot;
redirect(action&#58;show,id&#58;alunoInstance.id)
}
else
{
status.setRollbackOnly()
}


Porém quando add documentos à pessoa:


pessoaInstance.documentos.add(rg)
pessoaInstance.documentos.add(cpf)


Apresenta o seguinte erro:

Error 500: java.lang.NullPointerException: Cannot invoke method add() on null object
Servlet: grails
URI: /Matricula/grails/aluno/save.dispatch
Exception Message: Cannot invoke method add() on null object
Caused by: java.lang.NullPointerException: Cannot invoke method add() on null object
Class: AlunoController
15/09/2009 00:00


0
Consegui resolver o problema dessa forma:


pessoaInstance.addToDocumentos(rg)
pessoaInstance.addToDocumentos(cpf)


Valeu a tds...Abraços!!!!!!!!!
15/09/2009 00:00


0
[quote=&quot;ronny&quot;]Consegui resolver o problema dessa forma:


pessoaInstance.addToDocumentos(rg)
pessoaInstance.addToDocumentos(cpf)


Valeu a tds...Abraços!!!!!!!!![/quote]

Dica: para verificar como a linguagem/framework se comporta, use e abuse do Grails Console (comando grails console). Ele é uma mão na roda para experimentações rápidas como esta. <!-- s;) --><img src="{SMILIES_PATH}/icon_wink.gif" alt=";)" title="Wink" /><!-- s;) -->



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