GORM Relação NxN com várias tabelas
03/01/2012 14:23
0
Opa pessoal, cá estou com mais uma dúvida de iniciante.

Estou tentando fazer o seguinte:

videoconf x materiais
videoconf x locais
videoconf x periodos
etc.

Onde cada x representa uma relação NxN.

Tentei declarar em VideoConferencia ...

static belongsTo = [Local, Material, Periodo] .. o que seria equivalente a ...

static belongsTo = Local
static belongsTo = Material
static belongsTo = Periodo

Mas o grails não aceita esse array de Owners, nem redeclaração de belongsTo. Precisarei explicitar o mapeamento NxN das tabelas em Mapping?

Como é que rola isso no grails?
Tags: orm, muito-para-muitos


0
Oi Felipe, da uma olhada neste link aqui.

No final das contas, depende muito de como está sua modelagem. Se seu muitos-pra-muitos tiver atributos adicionais, você cria uma classe que os contenha, além dos relacionamentos.


0
Opa Kiko,

Estou seguindo o userguide e faço NxN em outros trechos normalmente.

O problema é que tenho um Domain Videoconferencia que precisa fazer NxN de forma independente com 4 outras tabelas.

V x Materiais
V x Locais

E não é permitido declarar belongsTo = Local, Material etc.

Pelo visto vou ter fazer o mapeamento explícito do joinTable ou criar as tabelas NxN de outra forma.

Não, não precisa de outros campos. É puro NxN.

Vlw


0
Felipe,

Também sou iniciante, mas quero dar meus pitacos rss.. talvez saia alguma(s) besteira(s), massss... a intenção é positiva rsss..

A sintaxe do belongsTo para fazer mais de um relacionamento em linha poderia ser feito da seguinte forma:
O "static belongsTo = [local:Local, material:Material,periodo:Periodo]"

MAAASSSSS não acho que é isso o que vc realmente necessita.

O belongsTo faz com que a coisa dentro do [] seja dependente da instancia da classe que vc está usando esse relacionamento. Se por exemplo vc excluísse um Local, iria excluir também todas as videoconfs, porque a videoconf é de um Local....

Será que o que vc precisaria não é do hasMany?

videoconf has many local(is), material(is), periodo(s)
local has many videoconf(s)
material has many videoconf(s)

olha no link que o henrique te passou...
basicamente a sintaxe é
"static hasMany = [locais:Local, periodos:Periodo, materiais:Material]"

Vc terá que mapear esses relacionamentos em todas as suas classes e já aproveita pra definir os construtores dos quais não poderão ser nulos...

Espero ter ajudado um pouco =)

Abraço e boa sorte!
03/01/2012 17:44


0
Ola Rafael, ..... omitirei o sinal de igual nos exemplos pq no teclado do celular nao tem....

Vamos la, a intencao é aprendermos mais sobre grails. A anatomia de uma relacao Muito-para-Muitos (NxN) é a mostrada no userguide...

Primeiro voce declara o tem muitos em ambas classes.

hasMany materiais

HasMany videoconferencias

So que uma das classes precisa ser owner.

Como videoconferencia tem muitos materiais, tenho de declarar...

BelongsTo materiais ... em videoconferencia

Ou seja, a partir do owner a outra classe vai ser adicionada...

videoconferencia.addToMateriais(Material.read(params.material))

Ate aqui, o userguide funciona.

So que no meu caso, videoconferencia tem relacionamento NxN com outras classes.

Eu teria de fazer Videoconferencia owner de Locais, periodos, etc.

Ai entra o problema do belongsTo ...

Static belongsTo Material, Local, Periodo ... é sintaticamente errado.

Static belongsTo [Material, Local, Periodo] ... é sintaticamente errado

BelongsTo Material
BelongsTo Local, etc é sintaticamente errado.

Ou seja, o grails so suporta NxN 1 vez por classe.

Desta forma, ou eu descubro uma maneira mais avancada de relacionar um domain com N outros domains via NxN ou terei de alterar minha modelagem forcando a declaracao da joinTable.

Isso implicaria em declarar explicitamente as tabelas

VideoconferenciaMaterial
VideoconferenciaLocal ... e por ai vai.

Sacou?

Isso eu resolvo no ORM do fw PHP que uso em 2 tempos, mas no grails esta me custando alguns dias de estudo de uma maneira menos POG de fazer.

O drama é esse.


0
Oi Felipe, no seu caso, pelo que estou vendo, é um many to many to many, certo?

Não seria mais simples incluir o hasMany no pai três vezes? Tava relendo aqui a sua primeira resposta, e acho que posso te ajudar.

"E não é permitido declarar belongsTo = Local, Material etc."

Nope, é sim. Você faz da seguinte maneira:


static belongsTo = [local:Local, material:Material, zeca:Zeca]


Resolveria seu problema, pois seria feito o relacionamento. Entendi direito?


0
Opa, vlw a atencao.

Estou na estrada agora mas à tarde darei um feedback.

Nao entendi o hasMany 3x .. visto que seria redeclaracao da variavel. Nao funciona.

E com relacao ao belongsTo .. eu ja havia tentando mas no grails 1.3.7 acontece o sseguinte:

BelongsTo [material:Material, local:Local] so é valido como 'pertece a' comum.

Ele nao aceitou como declaracao de owner pq vira variavel local.

Para owner so é valido 'belongsTo Domain', e apenas 1 domain.

Estas afirmacoes sao baseadas em testes auxiliado por usuarios grails mais experientes que eu. E foram testadas todas as alternativas.

Mais tarde escrevo um artigo explicando detalhadamente. Até lá espero poder apontar a solucao. Como deve ser algo que permanece no grails 2, acho que vai ser interessante.


0
Estou confuso
04/01/2012 17:01



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