Referências entre Objetos no JPA
Há algum tempo atrás eu coloquei um tutorial sobre JPA aqui. Bom, agora chegou a hora de falar de uma coisa super importante, usar referências entre objetos, isto porque dificilamente você vai fazer uma aplicação que tenha apenas uma classe isolada. Mas afinal porque eu gosto tanto de JPA? Simples, porque você deixa de lado todos os detalhes do mapeamento objeto-relacional para se concentrar em relações para representar. Explico.
Em JPA temos um conjunto de anotações (aquelas marcações que colocamos em Java com um @ na frente) que servem para identificar o comportamento dos objetos na hora de gravar em banco. Vamos começar com uma bem simples, uma referência @OneToMany (ah sim, um pouco de conhecimento de inglês vai ajudar muito nessa hora!)
Em uma relação @ManyToOne estamos indicando que a classe de origem tem uma referência para um objeto da classe destino, e que este último pode ser referenciado por vários objetos da classe de origem. Exemplo, Livro tem uma Editora (não vou discutir detalhes de modelagem, se é a melhor ou não, apenas um exemplo
) então em Livro teremos um atributo do tipo Editora, agora podemos colocar a anotação correspondente:
Exemplo:
@Entity
public class Livro implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String titulo;
private String autor;
private String isbn;
private int numPaginas;
@ManyToOne
private Editora editora;
//aqui vem o resto do código
}
Outros tipos de relação são: @OneToOne, @ManyToOne e @ManyToMany. Além disso podemos ter relações unidirecionais, como no caso do Livro Editora que apresentei ou bidirecionais, quando o objeto destino também conhece o objeto de origeme aí terá um atributo que aponta de volta. Um bom exemplo é quando temos OrdemDeVenda e ItemDeVenda, onde a primeira tem uma lista de itens, e a segunda tem um atributo único apontando para a ordem a qual pertence.
Exemplo:
@Entity
public class OrdemDeVenda implements Serializable {
//aqui tem várias coisas
@OneToMany(mappedBy = "ordemDeVenda")
private List<ItemDeVenda> itens;
//aqui tem várias coisas
}
@Entity
public class ItemDeVenda implements Serializable {
//aqui tem várias coisas
@ManyToOne
private OrdemDeVenda ordemDeVenda;
//aqui tem várias coisas
}
O que podemos ver então é que no caso de uma relação OneToMany bidirecional, ela terá um complemento ManyToOne, bem razoável
Existem na verdade muito mais opções para marcar, mas isso já é um começo para permitir algumas experiências. Uma nota importante, no Netbeans, quando você coloca um atributo em uma entidade ele já pede para que você marque o tipo de relação e aí basta escolher, inclusive se for bidirecional o Netbeans muda a outra classe para incluir o atributo correspondente.


Leave a Reply