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.
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.
detach()
El método detach()
se usa con el EntityManager:
@PersistenceContext
private EntityManager entityManager;
public void detachEntity(MyEntity entity) {
entityManager.detach(entity);
}
detach()
: La entidad está en estado gestionado y cualquier cambio se reflejará en la base de datos.
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()
.
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)
}
}
detach()
solo desvincula una entidad específica del contexto de persistencia.
CascadeType.ALL
o CascadeType.DETACH
), sus entidades hijas también pueden ser desvinculadas.
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
Jorge García
Fullstack developer