Solución:
Citando del manual de ObjectDB sobre la eliminación de objetos de entidad JPA:
Para eliminar un objeto de la base de datos, primero debe recuperarse (sin importar de qué manera) y luego, en una transacción activa, se puede eliminar utilizando el método de eliminación.
Remove lanza una IllegalArgumentException si el argumento no es una instancia de una clase de entidad o si es una entidad separada.
Al crear un objeto con new
operador, se convierte en una entidad separada, debe conservarlo si desea eliminarlo.
Al recuperar una entidad, está recuperando una entidad persistente.
Algo en esa dirección. EntityManager.remove funciona solo para entidades administradas. No importa cómo obtuviste estas entidades administradas, puede ser por ejemplo:
- a través de una consulta JPQL
- a través de la consulta Criteria API
- buscar método en EntityManager
- siguiendo la relación de alguna otra entidad.
- creó una nueva entidad y la persistió
Pero simplemente crear un nuevo objeto e intentar eliminarlo no funciona, porque este nuevo objeto no es una entidad gestionada. Además, la entidad aún no debe estar separada.
La vida de la entidad es prácticamente la siguiente, todo en la misma transacción (las entidades fuera de su transacción no se administran):
Entity ent = new Entity(1); //entity is in new state, EntityManager never know
//anything about it
em.persist(ent); //entity is managed as long as not disconnected
//from EntityManager
em.clear(); // all previously managed entities, including ent, are now detached
Entity same = em.find(1); //managed same
em.remove(same); // entity is removed
Sí, en caso de una operación de fusión o eliminación, debe usar una operación find () y luego usar el método de eliminación en la entidad recuperada.