Comportamento GORM X Modelo ER.
10/02/2012 18:43
0
Aê pessoal, tudo numa boa ??? Quero tirar algumas dúvidas aqui e levantar um assunto que agora me veio a mente sobre o ORM do GRails que acho que alguns podem discordar ou não.

Primeiramente, estou bastante confuso quanto ao que os relacionamentos que mapeamos em nossas Domains geram no BD.

Quero fazer um mapeamento simples de Estado -> Cidades por exemplo.

Em um MER eu pensaria que na tabela cidade, colocaria uma FK da PK de Estado para manter o relacionamento coeso. Assim com base em um código de um Estado, eu teria todas as cidades daquele.

Até aí nem um Mistério.

Eu consegui esse comportamento fazendo


class Cidade {

Integer codigo
String nome

static belongsTo = [estado: Estado]
}

ou

class Cidade {

Integer codigo
String nome

Estado estado
}


e Estado ficou apenas com seus campos comuns.

quando eu fiz assim:


class Estado {
static hasMany = [cidades: Cidade]
}


No banco, foi criado uma tabela estado_cidades que continha os ids de ambas as tabelas. Achei estranho, pois pensei que o hasMany era somente pra fazer o cascade da tabela Cidade para Estado.

Senti falta dessa explicação sobre o comportamento dos mapeamentos sobre o BD na doc (se bem que ainda não lí nem metade da mesma). Mas já lí todo o capítulo do GORM.

Agora entra a parte 2 da dúvida... Será que não estou me preocupando com o que não deveria ??? Afinal, quis entrar nesse mundo GRails justamente para mudar essa forma de desenvolver, que é pensar em um modelo ER ideal pra depois ir pensar em meus Objetos... Vejo que a Doc é voltada justamente para essa mentalidade e acho que é aí que eu estou me intrometendo onde não devia (rsrsrsrs), porém, me preocupo com questão da performance do que está sendo gerado automático.

Sempre penso que terei impactos mais lá na frente... Estou pensando correto ou estou paranóico ?? Gostaria de um Help nessa questão.

Abs []
Tags: GORM, hasMany, Banco de dados


0
Você está certo, tem que pensar na performance e o que não pensou :-)

Creio que o certo é a primeira opção, o belongsTo serve para quando for apagar o estado, que as cidades deste estado também sejam deletadas... maaasss para melhor performance, eu tiraria totalmente o belongsTo e deixaria cidade sem conhecer estado, apenas estado possuir cidades e fim (Associação unidirecional).

by
12/02/2012 05:35


0
Para esse caso, então teríamos o hasMany na Domain Estado correto ???

Porém, não vejo como isso seja a solução mais viável. É isso que ainda fico na dúvida, pois embora seja viável, não consigo enxergar como o "certo" a se fazer.

Para uma consulta posterior, só consigo imaginar com base no id do estado, buscar todas as cidades associadas à ele e com esse mesmo código, a partir de um registro de cidade, achar o Estado correspondente. Com a abordagem do hasMany o relacionamento Estado -> Cidades é simples, porém o Cidade -> Estado é bastante confuso.

Enfim...

Mais alguém tem alguma opinião à respeito ??

Obrigado pela atenção xnox

Abs []
12/02/2012 21:26


0
Olá, Adriano.

Amigo, quando você fez
class Cidade {

Integer codigo
String nome

Estado estado
}
(o outro código para "Cidade" estava incorreto na minha opinião)
e
class Estado {
static hasMany = [cidades: Cidade]
}


Não foram criadas apenas as tabelas "cidade" e "estado" com um campo "estado_id" na primeira tabela ligando-se à segunda? Quando fiz isso aqui com entidades muito parecidades foi isso que ocorreu.

Talvez num mapeamento equivocado as tabelas tenham sido criadas de maneira errada. Tente "dropar" as tabelas da base e rode a aplicação novamente. Um "clean" no projeto pode ajudar também.

Veja se
http://grails.org/doc/latest/guide/GORM.html#customCascadeBehaviour

e
http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/

ajudam você.

Abraços.


0
Ah, o "hasMany" em "Estado" não é obrigatório, mas traz benefícios, como a possibilidade de usar os métodos de relacionamento dinâmicos, como "addToCidades(...)", por exemplo.


0
Opa Yoshiriro, beleza ???

Vou testar agora mesmo com um projeto completamente novo...

Agora fiquei curioso, não dropei a base na mão, mas com certeza dei o clean, tô maníaco com ele já... rsrsrsrs

Vou fazer o Teste e já retorno.

Abs []
14/02/2012 14:49


0
Prezados, desculpo-me pela falta de atenção no ocorrido.

Yoshi, realmente realizei o Teste agora fazendo o seguinte:

class Estado {

String nome

static hasMany = [cidades: Cidade]
}


e

class Cidade {

String nome

Estado estado
}


Funcionou corretamente conforme segue:
---------------
Cidade:
- id
- version
- estado_id
- nome
---------------

---------------
Estado:
- id
- version
- nome
---------------

Com a FK de estado em cidade, tudo correto...

Não sei o que realmente aconteceu da outra vez, talvez tenha faltado o clean mesmo, enfim.

Abs [] e muito obrigado pela atenção de todos e pelo esclarecimento Yoshi.
14/02/2012 15:13



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