Persistência

6 respostas
J

Olá,

Estou com uma dúvida conceitual. Bom, vamos desde o começo.

Suponha que eu tenha uma entidade Grupo e uma entidade SubGrupo. O relacionamento entre elas é que um subgrupo pertence a um grupo. Se fomos modelar as classes, teremos algo assim:

class Grupo {
     ...
}

class SubGrupo {
     ...
     private Grupo grupo;
     ...
     public Grupo getGrupo() {
          return grupo;
     }

     public void setGrupo(Grupo grupo) {
          this.grupo = grupo;
     }
}

Bom, teremos uma agragação de um grupo na classe subgrupo.

Agora criaremos os DAO’s para grupo e subgrupo. Cada dao será responsável por carrega / salvar uma entidade. Então, o dao de grupo salva e carrega entidades do tipo grupo, enquanto o dao de subgrupo faz a mesma coisa só que para entidades do tipo subgrupo.

Imaginem o seguinte cenário:
Uma tela de cadastro de grupo. Você pode alterar todas as informações do grupo e mandar salvar. Bom, vamos supor que no código a gente fez algo assim:

subgrupo.setNome("123");
subgrupo.getGrupo().setNome("teste 123");

E nossos DAO’s foram implementados com o hibernate. Na hora que chamamos:

public void atualizar(Subgrupo subgrupo) {
     session.update(subgrupo);
}

O hibernate irá atualizar os dados do subgrupo bem como os dados do grupo. Isto não é incorreto? O nosso DAO dos subgrupos não deveria somente atualizar os dados do subgrupo?

Como vocês lidam com essa situação?

Abraços,
Fabio

6 Respostas

J

Olá,

bom primeiro vc começou tudo ao contrário =)
Uma Classe Grupo é que contém uma Lista de SubGrupos. Isto é o mais lógico. Assim como uma Classe Carrinho de Compras contém uma Lista de produtos.

Esta técnica de utilizar um Grupo dentro de um Subgrupo é utilizada para Associações inversas. Você poderá utilizar isso, mas apenas para referenciar, para saber de qual Grupo este subgrupo pertence.

Quanto a persistência, seria mais lógico se na sua “tela” vc colocasse para o cara cadastrar um Grupo, e dai fosse associando subgrupos a ele.
algo mais ou menos assim:

Grupo grupo = new Grupo(1,"Grupo 1");
Subgrupo sub = new SubGrupo(1,"SubGrupo1");
grupo.addSubGrupo(sub);

grupo.save();

Na parte que manda salvar tudo vai depender de como você tem essas Associaçoes mapeadas.

Mas em suma seria mais ou menos por ai.

Abraços!

J

Olá Juliano,

Então eu não concordo com a sua abordagem (putz, sempre sou do contra)…

Eu acho que a associação deveria ser do jeito que eu falei porque é mais fácil para o usuário querer saber qual é um grupo de um subgrupo do que ele saber os subgrupos de um grupo (em relação ao carrinho de compras eu concordo com você).

Eu vejo um problema na sua abordagem: o seu subgrupo deve permitir que o grupoId seja nulo. Sendo que isto eu não acho correto, já que na hora que você for cadastrar um subgrupo você deve saber a qual grupo este pertence. Do seu jeito, você deve cadastrar um subgrupo e depois ir alterar um grupo e associá-lo ao subgrupo.

Abraços,
Fabio

J

Não.

Você cadastrar primeiro um Grupo e depois ir associando Subgrupos a ele. Ou seja, Um subgrupo não existe sem um grupo. Assim como um Filho não existe sem um Pai. Regra básica.

A não ser qeu vc tenha uma associação Many-to-Many, que um grupo vai ter vários subgrupos, e um subgrupo vai pertencer a vários grupos.
Mas do jeito que vc falou, vc está cadastrando um subgrupo e criando o grupo na mesma hora. É muito estranho isso. Não que não possa ser, mas o mais normal, e “correto”, do ponto de vista teórico é VC ter um Pai existente e depois criar filhos para ele. A associação que vc faria no subgrupo com o grupo, seria apenas para consulta.

Mas o design é seu, vc quem manda, mas eu aconselho a vc dar uma olhada em alguns Softwares implementados, até mesmo nos exemplos da documentação do Hibernate. Tem bastante exemplos práticos lá.

Quanto ao exemplo que vc falou, do usuário querer saber qual o Grupo de um subgrupo, entra exatamente no exemplo que citei. No subgrupo, vc teria um objeto Grupo, que serviria somente para consulta. Ou seja, o usuário lista todos os subgrupos, e consegue ver qual o grupo que ele pertence. Mas não na hora de salvar.

ficaria mais ou menos assim:

class Grupo {
     private Integer codigo;
     private String descricao;
     private List<SubGrupo> subgrupos;
}

class SubGrupo {
     private Grupo grupo;
     private Integer codigoGrupo;
     private Integer codigoSubGrupo;
     private String descricao;

Onde neste exemplo, vc mapearia o grupo dentro da classe subgrupo, como innsert=“false” update=“false”. (Isto tem na documentação do Hibernate)

Bom, mas como disse, o design é seu, só dei uma sugestão, de como eu utilizo segundo minha experiencia e de como eu conheço de softwares por ai.

Abraço!

J

Este LINK pode ajudar tbm

J

Olá juliano,

Opa… agradeço a sua paciência =)…

Bom, me expressei mal. O que eu pensei é já ter os grupos criados. Aí o usuário iria na tela de subgrupos e cadastraria um novo subgrupo selecionando um grupo à partir de um dropdownlist por exemplo.

Bom, acho que você já respondeu minha pergunta com o insert=false e o update=false.

Bom, vou dar uma testada aqui… e se surgir mais dúvidas eu posto…

Muito obrigado pela atenção juliano…
Abraços

J

Agora me surgiu outra dúvida…

Quando fizer algo assim:

session.load(SubGrupo.class, "grupo1");

Tem como esse código só me trazer o id do grupo1, ao invés de preencher toda a classe do grupo???

Abraços

Criado 12 de julho de 2006
Ultima resposta 12 de jul. de 2006
Respostas 6
Participantes 2