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.

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Hibernate - TUTORIAL

Última atualização em: | 15050 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.


Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!