Hibernate @ManyToOne, muitos para um com objeto relacional
O Hibernate é o framework mais utilizado em projetos para tratar a persistência dos dados usando modelo relacional em projetos.
Última atualização em: | 15375 Visualizações
Por ser utilizado no modelo relacional, determinadas situações, é preciso criar o relacionamento entre os objetos como se estes fossem as tabelas do banco de dados, montando os relacionamentos de muitos para um, muitos para muitos e um para muitos. Neste artigo será mostrado como fazer o mapeamento de muitos para um e um para muitos entre os objetos.
O Banco de Dados
Para este exemplo usamos um relacionamento entre produto e item_produto e entre produto e estoque, não serão apresentados as colunas complementares, nos detendo apenas no relacionamento que será tratado neste artigo.
Cada item_produto ou estoque possui uma ligação com o produto, desta forma precisamos criar os objetos que representarão as tabelas e após relacionar os objetos de muitos para um e um para muitos.
Criando as Entidades
As entidades que representam as tabelas serão, a classe Produto, ItemProduto e Estoque, que seguem abaixo:
Classe: Produto.java
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="PRODUTO")
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
private Long id;
// getter - setter
}
Classe: ItemProduto.java
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="ITEM_PRODUTO")
public class ItemProduto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
private Long id;
// getter - setter
}
Classe: Estoque.java
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="ESTOQUE")
public class Estoque implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
private Long id;
// getter - setter
}
Mapeando a classe Produto em ItemProduto
Na classe ItemProduto temos um relacionamento de muitos para um, ou seja cada produto pode estar em nenhum ou muitos ItemProduto, então podemos escrever o relacionamento em objeto relacional da seguinte forma:
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="ID_PRODUTO")
private Produto produto;
O mesmo acontece na classe Estoque, onde o relacionamento de Produto com Estoque será o mesmo.
Entenda o código:
O @ManyToOne
, faz o mapeamento de muitos para um de Produto em ItemProduto, através dele é possível informar os seguintes parâmetros: fetch que pode ser EAGER ou LAZY, o EAGER, sempre vai carregar o produto quando for selecionado um ItemProduto e o LAZY só carrega o produto quando o programador quiser que ele seja carregado, passando esta informação na sentença que vai retornar. Também tem o cascade, que se refere ao tipo de relacionamento, isso deve ser definido ao criar a tabela no banco de dados e aqui usamos apenas a configuração de relação criada no banco de dados.
Ainda tem o @JoinColumn
, que define qual coluna é responsável pela ligação entre os objetos.
Mapeando a classe ItemProduto em Produto
Após criado o relacionamento de muitos para um, é possível criar o relacionamento de um para muitos na tabela de Produto, dessa forma podemos ter acesso a lista de ItemProduto que se relaciona com o Produto em questão, veja:
@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<ItemProduto> lsItemProduto;
Da mesma forma temos para estoque o mapeamento:
@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Estoque> lsEstoque;
Pronto, desta forma tem um mapeamento bidirecional de uma para muitos e muitos para um.
Usando Hibernate é possível simplificar o desenvolvimento de aplicações quando se utiliza armazenamento com banco de dados relacional, sem perder a relação entre os registros e sem precisar construir SQL para a comunicação com o Banco de Dados.
Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.