sábado, 11 de febrero de 2012

IllegalArgumentException: Removing a detached instance

Intentando borrar un objeto mediante un entityManager de JPA. Me apareció este error. Esto ocurre porque se intenta borrar un objeto que esta 'detached', osea que aunque se sabe que es un objeto que pertenece a la capa de persistencia, no esta asociado a la actual sesión del entityManager.

Estuve buscando por internet y di con varias soluciones, algunas de ellas no parecen pertenecer al conjunto de buenas practicas, las voy a enumerar (Tener en cuenta que el objeto entity es de la clase ObjetoDTO):

1. Realizar un merge del objeto para poder asociarlo al actual contexto
ObjetoDTO dto = entityManager.merge(entity);
entityManager.remove(dto);
2. Obtener la referencia del objeto que se desea borrar
ObjetoDTO dto = entityManager.getReference(entityClass, entity.getId());
entityManager.remove(dto);
3. Borrar mediante SQL el objeto que se quiere
Query query = entityManager.createQuery("DELETE FROM ObjetoDTO E where E.id= "+entity.getId());
query.executeUpdate();
En mi opinión la mejor opción es la tercera, puesto que las dos primeras realizan una nueva sentencia para poder obtener el objeto de la BBDD y asociarlo a la sesión actual.

1 comentario: