Desenvolvimento
  • JAVA
  • Java
    • Integração Java e C++ com JNI
    • Objetos Distribuídos com RMI
    • Teclas de Atalho do Eclipse
    • Apache Maven Framework
    • Hibernate Framework
      • @OneToMany Relacionamento 1:N
      • @ManyToOne Relacionamento N:1
  • WebServices
    • Web Services e Arquitetura Orientada a Serviços
    • Gerando Web Services PHP com NuSoap
    • Enviando uma Requisição SOAP a um Serviço
    • Web Services com Spring e Apache CXF
    • Web Services com JAX-WS
  • Microservices
    • Introdução à Microservices
  • Design Patterns Java
    • Design Patterns
  • Documentações Oficiais
  • Apache Maven
  • Apache Struts
  • Docker Hub
  • Maven Repository
  • Spring Framework
Powered by GitBook
On this page

Was this helpful?

  1. Java
  2. Hibernate Framework

@OneToMany Relacionamento 1:N

Anotação @OneToMany

PreviousHibernate FrameworkNext@ManyToOne Relacionamento N:1

Last updated 4 years ago

Was this helpful?

Exemplificando um relacionamento entre tabelas 1 para muitos com o uso das anotações do Hibernate. Modelando exemplo simples para demonstrar o uso do Framework de uma forma clara e direta. Segue o modelo a ser implementado.

Para exemplificar o relacionamento criaremos as classes persistentes Departamento e Funcionário. A classe Departamento possuirá o relacionamento 1:N através de um atributos do tipo lista de funcionários e a partir de uma anotação @OneToMany.

A implementação da classe persistente Funcionário fica da seguinte forma:

package br.com.rel.hibernate.model;

import java.sql.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name="tbFuncionario")
public class Funcionario {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_funcionario")
	private Integer id;
	private String nome;
	private Enum<SEXO> sexo;
	private Date nascimento;
	private String cpf;

	@ManyToOne(fetch = FetchType.EAGER)
	@Cascade(CascadeType.SAVE_UPDATE)
	@JoinColumn(name="id_departamento", insertable=true, updatable=true)
	@Fetch(FetchMode.SELECT)
	private Departamento departamento;

	public Funcionario() {

	}
        // Gerar Gets e Sets
}

A implementação da classe persistente Departamento fica da seguinte forma:

package br.com.rel.hibernate.model;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="tbDepartamento")
public class Departamento {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_departamento")
	private Integer id;
	private String nome;
	private String sala;
	private String andar;

	@OneToMany(mappedBy="departamento", fetch=FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private List<Funcionario> funcionarios;

	public Departamento() {

	}
        // Gerar Gets e Sets
}

As classes Funcionario e Departamento serão mapeadas em nosso banco de dados com os nomes tbFuncionario e tbDepartamento.

Nota-se que na classe Departamento foi feita a anotação @OneToMany que identifica o relacionamento 1:N, nesta anotação temos o atributo mappedBy com o valor ‘departamento’ onde este valor se refere a um atributo criado na classe Funcionario com o mesmo nome (ver classe Funcionario linha 37) este atributo serve em si para representar que na tabela tbFuncionario temos uma chave estrangeira relacionada a tbDepartamento, o atributo fetch define quando o conteúdo o atributo será recuperado da base de dados.

A anotação @Cascade indica a ação em cascata a ser empregada do objeto pai para os objetos associados. Já na classe Funcionario foi criado um atributo do tipo departamento que recebe as anotações @ManyToOne que define que existem muitos funcionários para um departamento, @Cascade define as operações em cascata, @JoinColumn que define a chave estrangeira da tabela tbFuncionario, @Fetch define como o atributo mapeado será recuperado da base de dados.

Relacionamento 1:N