Botón para abrir el Menú Botón para cerrar el Menú
Logo da empresa Alura
Iniciar Sesión Nuestros Planes
Formaciones Conoce a Luri
  • Programación _
  • Front End _
  • Data Science _
  • DevOps _
  • Innovación y Gestión _
Artículos de Tecnología > Programación

Entidades Managed, Transient y Detached en Hibernate y JPA

Alura
Paulo Silveira
Paulo Silveira
20/07/2021

Compartir

Distinguir entre los estados de una entidad en JPA / Hibernate es difícil al principio. Se dice que un objeto es transiente cuando no tiene representación en la base de datos y tampoco el EntityManager lo conoce, como a continuación:

Cliente c = new Cliente();

Aquí, cualquier cambio en el objeto referido por C no generará ningún tipo de insert o update en la base de datos. Lo contrario es cuando el objeto existe en la base de datos y el EntityManager en cuestión tiene una referencia a él, esta entidad está managed, gestionada por el EntityManager. Considera en una referencia a un EntityManager en el siguiente ejemplo:

Cliente c = new Cliente(); // transiente
em.persist(c); // gestionado

O también:

Cliente c = em.find(Cliente.class, 1); // gestionado

Cuando una entidad está managed, cualquier cambio en su estado (como una llamada de setter) resultará en una actualización de la base de datos en el momento del commit.

El último caso es cuando la entidad representa algo que posiblemente esté en la base de datos, pero el EntityManager lo desconoce: la entidad está fuera de contexto, detached. Ejemplo:

Cliente c = new Cliente();
c.setId(1);

Una entidad también está detached cuando el EntityManager de donde obtuvimos este Cliente (por ejemplo, cuando hicimos un find o proveniente de una Query) ya no está abierta. Cualquier cambio en esta referencia obviamente no tendrá ningún efecto en la base de datos. Para que este cambio surta efecto, es decir, para que reattach a la entidad, primero debemos vincularla al contexto de persistencia. Tenga en cuenta que en el EntityManager puede que ya exista una entidad Cliente con esta misma id, imagina lo que sucedería si tuviéramos un método que se llamara reattach o update?

Entonces el método es el merge. Une la posible entidad con la misma id que está en el EntityManager con la informada como argumento, y devuelve la que está managed. El método merge no hace reattach. Luego:

Cliente c = new Cliente();
c.setId(1);
em.merge(c);
c.setNome("Cliente con nombre cambiado");

¡No funcionará! Aquí deberías haber tomado lo que devolvió el merge. Nota el pequeño cambio:

Cliente c = new Cliente();
c.setId(1);
c = em.merge(c);
c.setNome("Cliente con nombre cambiado");

Listo. Una pequeña introducción sobre el ciclo de vida de una entidad en relación con a un EntityManager: ¡transient (la especificación se llama new), managed y detached! También tenemos el estado removed, cuando una entidad está marcada para su eliminación.

Paulo Silveira
Paulo Silveira

Paulo Silveira é CEO e cofundador da Alura. Bacharel e mestre em Ciência da Computação pela USP, teve sua carreira de formação em PHP, Java e nas maratonas de programação. Criou o Guj.com.br, o podcast do Hipsters.tech e o Like a Boss.

Artículo Anterior
Entendiendo el Lazy y el Eager Load de JPA
Siguiente Artículo
Aprende a programar en 10 años

Ver otros artículos sobre Programación

Navegación

  • Planes
  • Instructores
  • Blog
  • Política de privacidad
  • Términos de uso
  • Sobre nosotros
  • Preguntas frecuentes

¡CONTÁCTANOS!

  • ¡Quiero entrar en contacto!

Blog

  • Programación
  • Data Science
  • Front End
  • Innovación y Gestión
  • DevOps

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

NOVEDADES Y LANZAMIENTOS

Aliados

  • Programa de aceleração Scale-Up Endeavor
  • En Alura somos unas de las Scale-Ups seleccionadas por Endeavor, programa de aceleración de las empresas que más crecen en el país.
  • Growth Academy 2021 do Google For Startups
  • Fuimos unas de las 7 startups seleccionadas por Google For Startups en participar del programa Growth Academy en 2021
Alura

Powered by

Caelum

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

Cursos

Cursos de Programación
Lógica de Programación | Java
Cursos de Front End
HTML y CSS | JavaScript | React
Cursos de Data Science
Data Science | Machine Learning | Excel | Base de Datos | Data Visualization | Estadística
Cursos de DevOps
Docker | Linux
Cursos de Innovación y Gestión
Transformación Ágil | Marketing Analytics

Alura

  • Educação em Tecnologia

    • logo fiap FIAP
    • logo casa do codigo Casa do Código
    • logo pm3 PM3 - Cursos de Produto
  • Mais Alura

    • logo alura start START BY Alura
    • logo alura lingua Alura Língua
    • logo alura para empresas Alura Para Empresas
    • logo alura latam Alura LATAM
  • Comunidade

    • logo tech guide Tech Guide
    • logo 7 days of code 7 days of code
    • logo Hipsters ponto Jobs Hipsters ponto Jobs
  • Podcasts

    • logo Hipster Network Hipster Network
    • logo Hipsters ponto Tech Hipsters ponto Tech
    • logo Dev sem fronteiras Dev sem Fronteiras
    • logo Like a Boss Like a Boss
    • logo IA Sob Controle IA Sob Controle
    • logo Mesa de Produto Mesa de Produto
    • logo Decode Decode
    • logo FIAPCast FIAPCast