Volver a la página principal
sábado 22 marzo 2025
2

Cómo despegar una entidad del contexto en JPA con detach()

En JPA, el método detach() de EntityManager permite separar una entidad gestionada del contexto de persistencia, evitando que futuras modificaciones sean sincronizadas con la base de datos. Es útil cuando se desea modificar un objeto sin afectar los datos persistidos.

¿Cómo funciona detach() en JPA?

En Spring Data JPA, los objetos recuperados desde una base de datos están dentro del contexto de persistencia, lo que significa que cualquier cambio en ellos será detectado y aplicado al hacer flush() o commit(). Sin embargo, con detach(), una entidad deja de estar controlada por el contexto, permitiendo trabajar con ella sin riesgo de actualización automática.

Sintaxis de detach()

El método detach() se usa con el EntityManager:

@PersistenceContext
private EntityManager entityManager;

public void detachEntity(MyEntity entity) {
    entityManager.detach(entity);
}

Comportamiento

  • Antes de detach(): La entidad está en estado gestionado y cualquier cambio se reflejará en la base de datos.
  • Después de detach(): La entidad pasa a estado desvinculado, por lo que los cambios no serán persistidos a menos que se vuelva a adjuntar con merge().

Ejemplo de uso de detach() en JPA

@Service
public class MyService {

    @PersistenceContext
    private EntityManager entityManager;

    @Autowired
    private MyEntityRepository repository;

    public void processEntity(Long id) {
        MyEntity entity = repository.findById(id).orElseThrow();
        
        // La entidad está gestionada
        entity.setName("Nuevo Nombre");

        // Desvincular la entidad
        entityManager.detach(entity);

        // Esta modificación no se reflejará en la BD
        entity.setName("Nombre No Persistente");

        // Para persistir cambios nuevamente, se usaría entityManager.merge(entity)
    }
}

Consideraciones

  • detach() solo desvincula una entidad específica del contexto de persistencia.
  • Si la entidad tiene relaciones en cascada (CascadeType.ALL o CascadeType.DETACH), sus entidades hijas también pueden ser desvinculadas.
  • No libera memoria, solo elimina el rastreo del objeto en la sesión actual.

Alternativas a detach()

Si se necesita limpiar completamente el contexto de persistencia, se puede usar clear():

entityManager.clear(); // Elimina todas las entidades gestionadas en la sesión actual
Etiquetas:
java
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer