Persistência de dados em diversas tabelas
12/09/2016 10:10
0
Bom, estou tendo dificuldade em persistir dados de um formulário do sistema web. A questão é a seguinte:

Eu tenho alguns domínios:

?class Pessoa {
?Integer id
?String nome
?String cpfCnpj

?static mapping = {
?table 'PESSOA'
?id column: 'ID_PESSOA'
?nome column: 'NOME_PESSOA'
? ? cpfCnpj column: 'CPFCNPJ_PESSOA'
?}
}

class PessoaJuridica {
?Pessoa pessoa
?Integer id
?String inscricao
?String dataFundacao
?
?static mapping = {
?table 'PESSOA_JURIDICA'
?pessoa column: 'PESSOAJURIDICA_PESSOA'
?id column: 'ID_PESSOAJURIDICA'
?inscricao column: 'INSCRICAO_PESSOAJURIDICA'
?dataFundacao column: 'DATAFUNDACAO_PESSOAJURIDICA'
?}
}


class Empresa {
?Pessoa pessoa
?Integer id
?String nome
?String responsavel
?String telefone

?statick mapping = {
?table 'EMPRESA'
?pessoa column: 'EMPRESA_PESSOA'
?id column: 'ID_EMPRESA'
?nome column: 'NOME_EMPRESA'
?responsavel column: 'RESPONSAVEL_EMPRESA'
?telefone column: 'TELEFONE_EMPRESA'
?}
}

Agora vamos ao problema. Eu tenho um formulário na gsp onde o usuário preenche parte das informações de cada domínio, em uma situação diferente a outra parte é preenchida. Acontece que esse formulário, futuramente o usuário pode alterar essas informações, então eu devo pegá-las e alterar nas tabelas do Banco de Dados apenas o que foi mudado, aí que encontro o meu problema, porque não consigo pegar todos os dados por parâmetros (IDs de relação das tabelas, por exemplo, ou dados que são preenchidos exclusivamente em outro formulário), então as colunas que não recebo por parâmetro estão ficando nulas, o que não pode ocorrer em hipótese alguma. Gostaria que me indicassem formas em que vocês usariam para alterar apenas os dados requisitados, permanecendo os dados que não foram alterados. Agradeço desde já.
Tags: Grails


0
Oi Yuri,

o ponto neste caso diz respeito ao nome que você dá aos seus campos no formulário GSP.

Dicas rápidas: tire proveito do data binding do Grails.
Imagine que você queira selecionar a pessoa relacionada a uma empresa, tal como no seu exemplo.
Seu campo do tipo select para este campo se chamaria "pessoa.id". O controlador já faria o databinding diretamente para você.

Idem para os demais atributos da sua classe. Basta colocar o nome do atributo batendo com o da sua classe de domínio.


0
Eu já estou com todos os campos da GSP exatamente iguais ao domínio. O problema é que em uma mesma GSP eu tenho dados de três Domínios e quando eu dou .merge() ou.save() para fazer um update na base dados os campos que não vieram informados por parâmetros vão para a base dados null.


0
Oi Yuri,

nestes casos em que o formulário não bate com a classe de domínio, uma alternativa bem interessante é usar um command object. Você pode popular o command object no momento de submissão do formulário e, no próprio command object, ter funções que instanciem os objetos já para você.

Mas assim, de relance, pelo que você está dizendo, me parece (apenas um chute, ok?) algum erro de digitação nos nomes dos campos. Como você os está digitando?


0
Henrique muito obrigado pela dica do command object (ainda não o conhecia), porém como eu não me expressei de forma correta, meu problema não está sendo com os valores que recebo da GSP, estes estou recebendo perfeitamente, meu problema está sendo com as colunas da tabela que não recebem os dados dessa GSP, e sim de uma outra GSP, pois quando eu dou o save ou o merge, esses campos que não vem por parâmetros, porque não devem ser informados nessa página, estão ficando nulos, o que é o correto, porém preciso de uma lógica onde eu possa alterar apenas os campos que vem por parâmetros. Vou tentar citar um exemplo:

Supondo que eu tenha as 3 classes que informei lá no início do post, vou criar uma GSP para o cadastro de uma empresa. Nessa GSP de cadastro (Vamos chamar de GSP1, para exemplo) eu vou informar Nome(Pessoa), Cnpj(Pessoa), Pessoa(PessoaJuridica), Inscricao(PessoaJuridica), Pessoa(Empresa) e Nome(Empresa) . Agora vou criar uma outra GSP (Vamos chamá-la de GSP2) com um outro cadastro onde vou preencher dataFundacao(PessoaJuridica), Responsavel(Empresa) e Telefone(Empresa). Acontece que nos dois casos quando eu vou salvar os parâmetros da GSP1 os dados referentes a GSP2 ficarão nulos, porque os mesmos não estão contidos nesse cadastro, da mesma forma que quando vou salvar os dados da GSP2, os dados da GSP1 ficarão nulos, porque não são preenchidos neste cadastro. OBS: Entre parênteses escrevi a classe referente ao atributo.

Sei que essa é a forma correta de proceder, porém eu tenho que tratar isso, não posso deixar que ao salvar os dados da GSP1, os dados da GSP2 na tabela fiquem nulos, então gostaria que me indicasse alguma forma para tratar esse tipo de caso em especial, quando eu persistir os dados da GSP1, esse salvar não impactasse nos dados já persistidos da GSP2. Espero ter sido claro kkkkkkkkk'

Muito obrigado pela ajuda !


0
Resolvido:

Bom galera como acredito que não tenha sido muito claro na apresentação dos meus problemas, mas consegui uma solução (duvido que seja a melhor kkkk'), talvez explicando como resolvi o meu problema fique mais fácil de compreender o que eu precisava, enfim, vamos lá:

Tenho uma GSP que possui um formulário de alteração, esse formulário possui três domínios diferentes, porém ele não insere nas tabelas referentes todos os dados que ela possui, o que me acarretaria em problemas ao salvar, porque esses dados que não vinham por parâmetro ficariam nulos e eu não poderia deixar isso acontecer. Já que esses dados são importantes em outros formulários, então eu fiz um Find pelo ID do objeto, inseri as informações em um Map, depois peguei os parâmetros e através de um loop eu testei onde o Map e os parâmetros possuíam a mesma key, assim atualizando os dados e deixando intactas as informações que não são manipuladas nesse formulário.

Estou aberto a sugestões já que acredito que essa não seja a melhor forma de resolver esse tipo de problema. Obrigado !



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