# @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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://pauloricmarinho.gitbook.io/desenvolvimento/java/hibernate-framework/onetomany-relacionamento-1-n.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
