Dúvida para uso de JPA para criação de objetos que utilizam tabelas com relacionamento complexo

2 respostas
Ronaldo_Gibi1

Bom dia colegas!

Tenho projetado duas tabelas com estrutura similar às descritas abaixo:

Tabela Areas Produtivas:

  • Id Area Produtiva
  • Descricao Area Produtiva
  • Intervalo Inicio
  • Intervalo Fim

Tabela Atividades:

  • Id Atividade
  • Area Produtiva (é preenchido com o Id da Area Produtiva que possui o intervalo que o Id Atividade pertence)
  • Descricao Atividade

Obs.: Na tabela Atividades, o campo Area Produtiva não é persistido. Esta informação é apenas para apresentação na tela de qual área produtiva pertence aquela atividade.

Minha dúvida é a seguinte.

Existe um relacionamento entre a tabela Atividades e a tabela Áreas Produtivas. Porém está relação se consolida através do Id Atividade (tabela Atividades) e o Intervalo Inicio e Intervalo Fim (tabela Áreas Produtivas). Utilizo a palavra relacionamento para didaticamente expressar minha necessidade, visto que conheço como fazer este relacionamento utilizando as ferramentas conhecidas (aceito sugestões também).

Para clarear cito o Exemplo abaixo:
Instância Área Produtiva Laminação:

  • Id Area Produtivia = Laminação
    [color=darkred]- Intervalo Inicio - 100
  • Intervalo Fim - 200[/color]

Instância Atividade Içamento de Carga:

  • [color=red]Id Atividade: 150[/color]
  • Área Produtiva = Laminação (valor recebido da Instância Laminação)

Estou utilizando JPA e projetando minhas classes de persitências e encontrei o seguinte problema.
Como utilizar Annotation, NamesQueries ou outro recurso na classe Atividade para preencher o campo Área Produtiva, sendo que a informação vem do intervalo da classe Área Produtiva?

Alguem se Habilita em sugerir uma solução?

2 Respostas

Lavieri

c enendi bem

public class AreaProdutiva {
  private @Id @GeneratedValue Integer id;
  private String descricao; 
  private Integer inicio;
  private Integer fim;
  private @OneToMany(mappedBy="areaProdutiva") Set<Atividade> atividades = new LinkedHashSet<Atividade>();
  //apesar da tabela "Area Produtiva" não ter o campo "atividades", este pode ser mapeado,
  //pela propriedade "areaProdutiva" da tabela "Atividades", conforme mapeado acima

//... outro métodos

  public @Override String toString() { return getDescricao(); }
}

public class Atividade {
  private @Id @GeneratedValue Integer id;
  private @ManyToOne @JoinColumn(name="area_produtiva_id",referencedColumnName="id") AreaProdutiva areaProdutiva;
  private String descricao;
}

em resumo seria isso... suas tabela seria mais ou menos assim

AreaProdutiva
- id;
- descricao
- inicio
- fim

Atividade
- id
- area_produtiva_id
- descricao

onde... "area_produtiva_id" da tabela Atividade seria uma Foring Key da tabela de AreaProdutiva ligado ao campo "id"

... por exemplo, neste caso que vc ficou, vc teria

AreaProdutiva laminacao = findByDescricao(AreaProdutiva.class,"Laminação");

System.out.println(laminacao.getDescricao()); //imprime: Laminação
System.out.println(laminacao.getInicio()); //imprime: 100
System.out.println(laminacao.getFim()); //imprime: 200

//conciderando que laminacao so tenha a ativdade Içamento de carga.
for(Atividade atividade : laminacao.getAtividades()) {
   System.out.println(atividade.getId()); // imprime: 150
   System.out.println(atividade.getDescricao()); //imprime: Içamento de Carga
   System.out.println(atividade.getAreaProdutiva()); //imprime: Laminação
}
Ronaldo_Gibi1

Boa tarde Colega.

Na verdade eu desejava não criar a chave estrangeira e fazer o gerenciamento da atividade via código início e codigo fim da Area Produtiva. Mas seria complexo demais visto que teria que fazer este gerenciamento todo em código na camada de persistência.
Acho que a solução que você apresentou é clássica e a mais recomendada.
Obrigado pelo apoio.

Criado 29 de abril de 2009
Ultima resposta 1 de mai. de 2009
Respostas 2
Participantes 2