Entities filhas devem conhecer a Entitie pai?

1 resposta
MauricioAniche

Pessoal,

Acabei nem sabendo como dar nome a este tópico. Mas levanto um assunto legal. Vou dar um exemplo bem simples, não quer dizer que nesse exemplo seja um bom exemplo, mas foi o primeiro que eu pensei.

Um pedido tem uma lista de itens… O domínio deve ser algo do tipo:

class Pedido {
  List<Item> itens;
  // ...
}

class Item {
  Produto produto;
  int qtd; 
  // ...
}

A minha dúvida é: A classe Item pode ter um ponteiro para a classe Pai?

class Item {
  Pedido pedido; // pai aqui!!
  Produto produto;
  int qtd; 
  // ...
}

As vezes é muito útil, você dentro de um filho saber qual é o pai dele! Na tabela do banco de dados, você tem a Foreign Key apontando para o pai, então carregar o pai é teoricamente fácil. Só tem que tomar muito cuidado para não entrar num loop infinito, e o pai carrega o filho, o filho carrega o pai, e assim por diante…

O que vocês fazem quando estão num filho e precisam do pai? Ou nunca precisam? Vocês modelam o sistema pra sempre passar a classe pai, com o filho/lista de filhos dentro ??

[]'s
Mauricio

1 Resposta

sergiotaborda

Pode.

Existe uma relação inerente ao pai e ao filho chamada composição. O itens não fazem sentido sem o pai, logo faz sentido ter uma forma de obter o pai a partir do filho. Contudo não é permitido carregar filhos que não estejam dentro de pais. Ou seja, vc não pode pegar a lista de itens “solta” tem que pegar apenas o pai e o sistema traz o resto. Para evitar o problema do loop vc faz assim

class Pedido {
   List<Item> itens;

   public void addItem (Item item ){
          if (item.pedido == null ){
                item.pedido = this;
                itens.add(item);
          } else if (!item.pedido.equals(this)){
             throw new IllegalArgumentException("Item pertence a outro pedido");
          }
   }
}

class Item {
  Pedido pedido; // visivilidade pacote
  
  private Produto produto;
  private int qtd; 
  // ...

  public Pedido getPedido(){
     return pedido; // não ha set para este atributo.
 }

}

Durante a leitura, vc lê o pedido e depois os itens e invoca addItem para cada um sem ler o campo “pedido” do item do banco. Ele será associado dentro do prorpio pedido

Mas atenção, esta tecnica só é valida de existe uma relação de composição.

Criado 29 de abril de 2008
Ultima resposta 29 de abr. de 2008
Respostas 1
Participantes 2