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));