jpa sql-delete entitymanager illegalargumentexception

jpa - java.lang.IllegalArgumentException: eliminación de una instancia separada com.test.User#5



sql-delete entitymanager (5)

Tengo un proyecto de EE de Java usando JPA (tipo de transacción = "JTA"), hibernación como proveedor. Escribo mis frijoles para manejar las cosas CRUD. El programa se ejecuta en JBOSS 7 AS.

Tengo un EntityManagerDAO:

@Stateful public class EntityManagerDao implements Serializable { @PersistenceContext(unitName = "dtdJpa") private EntityManager entityManager; @TransactionAttribute(TransactionAttributeType.REQUIRED) public Object updateObject(Object object) { object = entityManager.merge(object); return object; } @TransactionAttribute(TransactionAttributeType.REQUIRED) public void createObject(Object object) { entityManager.persist(object); } public void refresh(Object object) { entityManager.refresh(object); } public <T> T find(Class<T> clazz, Long id) { return entityManager.find(clazz, id); } @TransactionAttribute(TransactionAttributeType.REQUIRED) public void deleteObject(Object object) { entityManager.remove(object); } }

pero cuando invoco deleteObject , deleteObject esta excepción.

java.lang.IllegalArgumentException: eliminación de una instancia separada com.test.User # 5

¿Cómo es esto causado y cómo puedo resolverlo?


A veces es simplemente porque te falta la anotación @Transaction para agregar, eliminar, actualizar operaciones.


A veces puedes obtener una identificación de una instancia separada y luego usar la consulta directa a la base de datos. Como ejemplo

String petId = pet.getId().toString(); entityManager.createQuery("DELETE FROM Pet pet WHERE id=" + petId).executeUpdate();

Después de que puedas limpiar el contexto

if (em.contains(pet)){ em.remove(pet); }


En mi caso, recibí el mismo error, cuando traté de eliminar un objeto usando,

session.delete(obj)

sin crear ninguna transacción antes de eso.

Y el problema se resuelve creando primero la transacción (session.beginTransaction () y luego eliminando el objeto.

Espero que mi respuesta ayude a alguien :)


Me enfrenté al mismo problema. La entidad separada debe volver a unirse. Como se mencionó en @BalusC, se debe usar EntityManager.merge() para adjuntar la entidad separada. EntityManager.merge() genera SQL Query que recupera el estado actual de la entidad, en la que debe EntityManager.remove() . Pero en mi caso no funcionó. Pruebe EntityManager.remove(EntityManager.find(Class<T>,arg)) lugar. Funcionó para mí


EntityManager#remove() solo funciona en entidades que se gestionan en la transacción / contexto actual. En su caso, está recuperando la entidad en una transacción anterior, la almacena en la sesión HTTP y luego intenta eliminarla en una transacción / contexto diferente. Esto simplemente no funcionará.

EntityManager#contains() verificar si la entidad es administrada por EntityManager#contains() y si no es así, haga que la administre EntityManager#merge() .

Básicamente, el método delete() de su clase de servicio empresarial debería verse así:

em.remove(em.contains(entity) ? entity : em.merge(entity));