Duvida como unir dados de outra classe
20/06/2012 20:50
0
Possuo um projeto no qual possui uma classe chamada Cliente e outra Classe chamada Endereço. Sendo que esta classe Endereco esta relacionada com outras classes. Gostaria de saber como fazer para que os dados da classe Endereço apareçam para serem preenchidos nas demais classes?

class Cliente {

String nmCliente
String profissao
String estadoCivil
Date dtNascimento
String email,email2
String cpf
String registroGeral
String telefone1,telefone2
String celular1,celular2
char sexo
Endereco endereco

static belongsTo = [Endereco]

static hasMany = [locacoes:Locacao]

static mapping = {version false}

static constraints = {
nmCliente(blank:false)
email(blank:false,email:true)
celular1(blank:false)
}
}

class Endereco {

String cep
String nmLogradouro
String numero
String dsBairro
String dsComplemento
String nuApto
Cidade cidade

static belongsTo = [Cidade]

static hasMany = [clientes:Cliente, empresas:Empresa,clientes:Cliente,colaboradores:Colaborador]

static mapping = {version false}

static constraints = {
cep(blank:false)
nmLogradouro(blank:false)
numero(blank:false)
dsBairro(blank:false)
}
}
Tags: domain, classes, unir


0
Opa Edinei... Primeiramente, seja bem-vindo ao fórum...

Uma pergunta que lhe farei e que precisa ficar bem claro o porque perguntei...

Você vai ter Clientes, Empresas e Colaboradores em um mesmo Endereço ???

Pergunto isso, pois sei lá, nunca se sabe a que ponto chegou a ideia de requisitos na cabeça dos usuários por aí...

Perceba que Endereço, normalmente é uma Entidade que atende diretamente somente a 1 dessas outras entidades... Ou ele pertence a um cliente, ou a uma empresa, ou a um colaborador. Você concorda comigo até aqui ???

Então aconselho que você altere o seu modelo pra refletir esse relacionamento entre seus domínios de forma mais clara, não é um Endereco que vai ter vários clientes, é 1 Cliente que terá 1 Endereco; 1 Empresa terá 1 Endereco; 1 Colaborador terá 1 Endereco.

Lembro-lhe que isso pode não ser verdade absoluta e ambos terem mais de 1 Endereco, mas essa discussão podemos deixar pra depois quando essa primeira parte evoluir.

Eu fui claro cara ??? Você concorda, discorda ???

Abs [] e vamos trocando ideias...
20/06/2012 21:36


0
valeu pela sugestao... porem na minha concepçao colaboradores, empresas e clientes nao devem ter endereço incluido nas proprias tabelas e sim ter uma unica tabela de endereços para armazenar os dados de cada classe....
20/06/2012 21:44


0
Não foi o que eu falei... Em momento algum disse que eles precisam estar na mesma entidade...

Perceba que deixei bem claro a separação da entidade Endereco e das entidades Cliente, Empresa, Colaborador.

O que você está fazendo é dizer "O Cliente Edinei pertence a [belongsTo] ao Endereco 'Rua dos blá blá'" Essa sentença faz sentido pra você ????

Abs [] e vamos trocando ideias...
20/06/2012 22:00


0
Bom desculpe se me expresse mal.. voce pode auxiliar como ficaria a modelagem se possivel?
20/06/2012 22:06


0
rsrsrsrsrsrs :D Sem problema amigo, estava provocando a conversa levantando questões para realmente forçá-lo a pensar em uma alternativa.

Mas vamos lá, vou fazer o básico e depois vamos evoluindo Ok ???

Temos uma classe Cliente como essa abaixo


class Cliente {
String nome
}
e uma classe Endereco

class Endereco {
String logradouro
Integer numero
}


Precisamos relacionar essas duas classes para dizer que: "O Cliente Edinei, possui o Endereco X"

Para tal montagem, posso dizer que: "O Endereço X pertence ao Cliente Edinei". Você concorda...

Se sim, temos o seguinte cenário formado:


class Cliente {
String nome

static hasOne = [endereco:Endereco]
}

e

class Endereco {
String logradouro
Integer numero

static belongsTo = [cliente:Cliente]
}


Assim você monta as 2 sentenças que coloquei lá em cima e monta uma relação de 1 - 1 entre cliente e endereço...

Assim, com esse cenário (que pode evoluir em breve) você consegue contemplar as 2 frases que colocamos lá em cima...

"O Cliente Edinei, possui o Endereco X"
"O Endereço X pertence ao Cliente Edinei"

Abs [] e vamos trocando ideias...
20/06/2012 22:15


0
Erratas...

- Você concorda ???

Faltou o ponto de interrogação pra se caracterizar uma pergunta... Pareceu uma afirmação.
20/06/2012 22:17


0
certo. entendi... porem o que gostaria de saber é como mostrar para o usuario no cadastro de cliente os campos da entidade Cliente e Endereço juntas..
20/06/2012 22:51


1
Acho que você pode utilizar o conceito de classes incorporadas para esse propósito. Em Java é conhecida como a famosa "Composição".

Basicamente, trata-se de utilizar a conveniência de um único objeto de domínio mas sem a complicação de se criar tabelas separadas na base de dados para esse propósito. Típico para cenários de relacionamento 1:1, veja:

class Cliente {
String nmCliente
String profissao
String estadoCivil
Date dtNascimento
...
Endereco endereco -> referencia à classe incorporada.
static embedded = ['endereco' ] -> aqui está a mágica.
}
class Endereco {
String cep
String nmLogradouro
String numero
String dsBairro
...
}

Assim você mantém a semântica de O.O. sem a necessidade de uma tabela extra de "Endereço" ocupando espaço no seu BD.

Segue um outro link que aplica outro exemplo bem sucinto:
http://grails.org/doc/latest/ref/Domain%20Classes/embedded.html


Se você quiser apresentar na sua view o cliente e o endereço ao mesmo tempo, o plugin do "twitter bootstrap" para grails dá esse suporte no caso de vc querer gerar a view com o recurso do sacaffolding!! Dá uma olhada no visual:

http://grails-twitter-bootstrap.cloudfoundry.com/person/create


Espero poder ter ajudado. Abraços!
20/06/2012 23:28


0
Opa!

Esqueci de dizer que no exemplo acima as DUAS classes devem ser criadas no MESMO arquivo .groovy. No caso, no arquivo Cliente.groovy.

Abraços.
20/06/2012 23:31


0
show d bola cara....vou verificar
20/06/2012 23:58


1
Show de Bola o recurso CarlosG... Valew por compartilhar...

Porém, fiquei curioso sobre o porque você acha complicado não criar uma nova entidade com um propósito completamente diferente ????

É só curiosidade mesmo viu cara ??? É porque normalmente uso assim porque componho Minhas entidades com mais de 1 Endereço e dependendo do Sistema...

Outra questão que eu levanto é, se a composição nesse caso criará esses campos dentro da mesma tabela de Cliente ?????

Lembre-se que no cenário atual dele, além de cliente, ele vai manter empresa e colaborador, teria que replicar essa classe dentro de cada arquivo do novo domain ??? E quando um dado mudar ???

Valeu mesmo por compartilhar o recurso...

Abs []
21/06/2012 00:02


1
É apenas uma abordagem, @adrianosi. É bem conveniente neste caso específico de Cliente/Usuarios/Enderecos. Mas claro que, muitas das vezes, o conceito não se aplica. E vc acaba tendo que apelar para Heranças e outros recursos mais "custosos".

Quanto aos atributos, sim, eles são criados dentro da mesma tabela cliente. Mas vc continua tendo a convenção O.O. de fazer um "new Endereco()", o que é muito legal! É uma forma de "tunar" a sua aplicação, já que com um único select vc recupera ambas as instâncias.

Em relação à manter a mesma classe em "Empresa" e "Colaborador"... Aí teria que se estudar o modelo de dados mesmo. Talvez ele precise refatorar. Ou, simplesmente, usar o recurso mais apropriado para a situação. Particularmente, não replicaria a entidade nas outras classes, até porque estaria fugindo da metodologia DRY.

No mais, é bacana explorar esses conceitos fornecidos pelo groovy/grails. Tem muita coisa bacana que resolve uma penca de problemas que esbarramos diariamente usando uma linguagem como o Java, por exemplo. Vale a pena estudar sobre eles!

Abraços.
21/06/2012 00:28


0
Pow Carlos... Selou... Realmente levantei essas dúvidas a fim de reconhecer se estávamos ou não no mesmo pensamento.

Fantástico o recurso mesmo cara, vai servir em breve com certeza...

Edinei, e aí ??? já andou com alguma coisa no problema ???

Abs []
21/06/2012 12:13


0
Bom.. gostaria de agradecer as respostas, pois me auxiliaram na modelagem de dados e conheci alguns conceitos novos.
Obg.
29/06/2012 21:05


0
Carlos, ainda ficou uma duvida minha, em java eu criaria a classe endereço do tipo @Embeddable
e na classe cliente eu chamaria o endereço do tipo @Embedded.
Voce disse q no grails essa classe endereço ficaria dentro de cliente. Entao para cada classe minha que for usar endereço eu tenho que colocar ela dentro dessa minha classe que vai usa-la, como no modelo acima??
Nao bastaria eu criar endereço uma unica vez como no java e utilizar pra quais classes eu quiser???
30/07/2012 11:36



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