Entendendo o método merge do JPA \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 12 Horas 

 43 Min 

 47 Seg 

   Tempo restante da oferta: 12 43 47 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Entendendo o método merge do JPA  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

# Entendendo o método merge do JPA

 Aprenda como o método merge do JPA funciona e utilize-o corretamente em seu projeto.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 10 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/jpa.jpg)  

O **JPA** trouxe muitos benefícios para os desenvolvedores Java, mas existe certa dificuldade em entender alguns detalhes desta especificação.

Para facilitar esta compreensão, vamos aqui analisar um método que gera muita controversa, que é o `merge`.

[  ![React Native - Acesso às APIs de Hardware](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/react-native.svg)   Curso React Native - Acesso às APIs de Hardware Conhecer o curso ](https://www.treinaweb.com.br/curso/react-native-acesso-as-apis-de-hardware)

### Estados de um objeto JPA

Antes de vermos o método `merge` em detalhes, é importante entendermos os estados das entidades JPA, pois estão diretamente relacionados com a função deste método.

No JPA um objeto pode assumir quatro estados: **New**, **Managed**, **Removed** e **Detached**. A imagem abaixo ilustra o ciclo de vida de um objeto que passa por esses quatro estados:

![](https://d2m498l008ebpa.cloudfront.net/2016/11/Desenho1.png)

Quando um objeto é criado, ele se encontra no estado **New**. Neste estado, o objeto não tem nenhuma relação com `EntityManager` ou uma representação no banco de dados. Qualquer alteração no objeto, neste estado, não é notada pelo JPA.

Quando o objeto é persistido (geralmente em um banco de dados), ele passa para o estado **Managed**. Neste, qualquer alteração no objeto será sincronizada com o dado persistido. Essa sincronização não é em tempo real. Uma alteração no objeto não irá executar automaticamente um comando SQL, isso só irá acontecer em “flush time”.

O “flush time” ocorre por padrão (de acordo com a implementação do Hibernate, uma vez que a especificação do JPA não define isso) em três momentos:

- Antes da execução de uma query.
- Na chamada do método `commit()` de `EntityTransaction`.
- Na chamada do método `flush()` de `EntityManager`.

É muito comum o objeto se manter por pouco tempo no estado **Managed**, pois, geralmente, após persistí-lo, o `EntityManager` já é fechado e então ele passa para o estado **Detached**.

O estado **Detached** significa que o objeto não está vinculado ao `EntityManager`. Qualquer alteração não irá impactar no dado persistido. Isso só irá ocorrer se o estado voltar a ser **Managed**.

Por fim, temos o estado **Removed**. O objeto assume este estado quando um objeto **Managed** é marcado para a remoção com o método `remove`.

### Funcionamento do merge

Agora que conhecemos os estados de um objeto JPA, é possível afirmar que ele só pode ser alterado, quando este está no estado **Managed**. Mas como definir um objeto neste estado? Bom, isso pode ser feito através de dois métodos: `persist` e `merge`.

O funcionamento do `persist` é bem simples: ao ser chamado, o objeto é salvo no banco e o seu estado muda para **Managed**.

Já o funcionamento do `merge` irá depender de alguns fatores. O seu comportamento principal é lidar com objetos no estado **Detached**. Quando um objeto neste estado é passado para o método `merge`, é retornado um novo objeto no estado **Managed**.

Se o objeto estiver no estado **New**, mas tendo os seus dados exatamente iguais aos persistidos na base, o `merge` retornará um novo objeto no estado **Managed**. Mas, se o objeto no estado **New** contiver ao menos um dado diferente dos persistidos, será gerado um novo registro e, um novo objeto no estado **Managed** será retornado.

Se o objeto contiver outros objetos relacionados (através de uma propriedade de relacionamento) e o JPA não conseguir localizar seus dados no banco, também será gerado um novo registro do objeto e também dos que estiverem relacionados. Além disso, um novo objeto no estado **Managed** também será retornado.

Se o objeto estiver no estado **Removed** o método `merge` irá gerar um erro.

Repare que sempre cito que o `merge` retorna o objeto no estado **Managed**. Assim, o uso correto desse método é:

```java
Entidade e = new Entidade();

Entidade e2 = em.merge(e);

e2.setAtributo(novoValor);

```

Veja que penas o objeto `e2` se encontra no estado **Managed**. Qualquer alteração em `e` não será sincronizada com o banco. Se o `e` fosse alterado, como abaixo:

```java
Entidade e = new Entidade();

em.merge(e);

e.setAtributo(novoValor);

```

Ao executar o “flush”, a alteração não seria refletida no banco de dados.

Caso não tenha certeza se o método `merge` irá gerar um novo registro ou não, opte pelo uso do `find`:

```java
Entidade e = em.find(Entidade.class, 1);

```

Este método sempre irá retornar um objeto no estado **Managed** (ou `null` se o registro não for encontrado). Aí não corremos o risco de gerar um novo registro apenas para se obter um objeto neste estado.

[  ![macOS - Fundamentos para desenvolvedores](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/macos.svg)   Curso macOS - Fundamentos para desenvolvedores Conhecer o curso ](https://www.treinaweb.com.br/curso/macos-fundamentos-para-desenvolvedores)

- [ #JPA ](https://www.treinaweb.com.br/blog/tag/jpa)
- [ #Hibernate ](https://www.treinaweb.com.br/blog/tag/hibernate)
- [ #Banco de dados ](https://www.treinaweb.com.br/blog/tag/banco-de-dados)
- [ #Java ](https://www.treinaweb.com.br/blog/tag/java)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/18113452/MTV-DJANGO-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ Entendendo o MTV do Django ](https://www.treinaweb.com.br/blog/entendendo-o-mtv-do-django) 

     Veja neste artigo como funciona o padrão de projeto utilizando em projetos Django, o MTV.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/inje--o-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     10 anos atrás

    ##  [ Entendendo injeção de dependência ](https://www.treinaweb.com.br/blog/entendendo-injecao-de-dependencia) 

     Aprenda o que é injeção de dependência e como o princípio da inversão de dependência é importante para diminuir o acoplamento dos seus códigos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/13164211/JAVASCRIPT-COISAS-ESTRANHAS-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     7 anos atrás

    ##  [ JavaScript - Entendendo as partes estranhas ](https://www.treinaweb.com.br/blog/javascript-entendendo-as-partes-estranhas) 

     Conheça o motivo por trás de vários comportamentos considerados estranhos que o JavaScript possui.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/container-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Container de injeção de dependência (DI Container) ](https://www.treinaweb.com.br/blog/container-de-injecao-de-dependencia-di-container) 

     Injetar dependências pode se tornar uma tarefa tediosa quando se têm muitas classes envolvidas. Um container de injeção de dependência resolve grande parte desse problema.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/16131227/di-autowiring-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Autowiring em Container de Injeção de Dependência ](https://www.treinaweb.com.br/blog/autowiring-em-container-de-injecao-de-dependencia) 

     Dando sequência aos artigos sobre Injeção de Dependência e Container de Injeção de Dependência, nesse artigo veremos como implementar a resolução automática de dependências, algo comum em Frameworks como Laravel, Symfony etc.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/01/11101814/DJANGO-FORMS-400x280.png)  [ HTML ](https://www.treinaweb.com.br/blog/categoria/html) 

     8 anos atrás

    ##  [ Criando formulários automaticamente com Django ](https://www.treinaweb.com.br/blog/criando-formularios-automaticamente-com-django) 

     Veja neste artigo como utilizar o Django para renderizar um formulário de cadastro de forma automática sem que precisemos escrever HTML.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/17132411/middlewares-aspnet-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Compreendendo os middlewares no ASP.NET Core ](https://www.treinaweb.com.br/blog/compreendendo-os-middlewares-no-asp-net-core) 

     Veja como os middlewares funcionam em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/12/NEST-JS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Autenticação: Protegendo Rotas com NestJS e Passport ](https://www.treinaweb.com.br/blog/autenticacao-protegendo-rotas-com-nestjs-e-passport) 

     Neste artigo vamos aprender a proteger rotas com o NestJS e a biblioteca passport, utilizando a estratégia de autenticação com Tokens JWT.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/asp-net-conhecendo-as-minimal-api-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     4 anos atrás

    ##  [ ASP.NET - Conhecendo a Minimal API ](https://www.treinaweb.com.br/blog/asp-net-conhecendo-as-minimal-api) 

     Neste artigo vamos conhecer um dos recursos que foram adicionados no .NET 6/ASP.NET 6, que é um novo template de aplicações Web, a Minimal API.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/09/ux-research-e-360-view-o-que-e-e-como-pode-ser-aplicado-400x280.png)  [ Acessibilidade e User Experience (UX) ](https://www.treinaweb.com.br/blog/categoria/acessibilidade-e-user-experience-ux) 

     6 anos atrás

    ##  [ UX Research e 360 View – O que é e como pode ser aplicado? ](https://www.treinaweb.com.br/blog/ux-research-e-360-view-o-que-e-e-como-pode-ser-aplicado) 

     Entenda o que é e como aplicar o UX Research e 360 View, técnicas importantes na hora de pensar em uma melhor experiência do usuário.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Trabalhando com eventos no NestJS ](https://www.treinaweb.com.br/blog/trabalhando-com-eventos-no-nestjs) 

     Neste artigo vamos aprender a utilizar os eventos com o NestJS, criando um exemplo onde vamos simular o envio de e-mails.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

     3 anos atrás

    ##  [ Cron jobs, timeouts e intervals com NestJS ](https://www.treinaweb.com.br/blog/cron-jobs-timeouts-e-intervals-com-nestjs) 

     Neste artigo vamos utilizar o módulo nativo scheduler do NestJS para trabalhar com tarefas automatizadas com cron jobs, timeouts e intervals

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **12h 43min 47s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
