> For the complete documentation index, see [llms.txt](https://pauloricmarinho.gitbook.io/desenvolvimento/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pauloricmarinho.gitbook.io/desenvolvimento/java/hibernate-framework/onetomany-relacionamento-1-n.md).

# @OneToMany Relacionamento 1:N

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.

![Relacionamento 1:N](/files/-MJrSRY5isbkTkdhnF8q)

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:

```java
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
}
```

&#x20;A implementação da classe persistente **Departamento** fica da seguinte forma:

```java
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.
