java - manytomany - jpa eliminar el elemento de la lista
many to many jpa spring boot (4)
Esto debería funcionar en caso de que tenga orphanRemoval=true
(JPA 2.0).
Para JPA 1 no hay una forma estándar de manejar esto. Hibernate tiene @Cascade
donde puedes especificar DELETE_ORPHAN
Tengo una relación 1-N (el objeto tiene una lista) y quiero eliminar un elemento de la lista. ¿Cuál es la forma correcta de eliminar un elemento en la lista con JPA?
¿Tengo que actualizar primero la lista y fusionar el propietario y eliminar el elemento después (si no elimino el elemento y simplemente fusionar el propietario, el huérfano permanecerá en DB, a la derecha)? ¿En qué secuencia se deben fusionar () y eliminar (), importa el orden de eliminar () y fusionar ()?
Muestra de código:
List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
owner.remove(itemToRemove);
em.merge(owner);
em.remove(itemToRemove);
Esto es suficiente:
List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
items.remove(itemToRemove);
Cuando se vacía el itemToRemove
, se eliminará el enlace entre el owner
y itemToRemove
. Y si CascadeType.ALL
está configurado a CascadeType.ALL
, también se eliminará itemToRemove.
En realidad, una versión más corta (y equivalente) es esta:
List<Item> items = owner.getItems();
// no need to keep a reference to the object that has to be removed
items.remove(index);
Referencia:
- Entidades de gestión ( tutorial de Java EE 5 )
[lamentablemente no hay ningún pasaje en el que se escriba explícitamente, hay que leer un poco las líneas]
Gracias chicos por las respuestas. Sus respuestas son muy similares, pero hay algunas diferencias leves.
Solo quiero asegurarme de que lo entiendo bien:
- En JPA 1.0 (en general) tengo que llamar a remove () en las entidades a las que se hace referencia. No se eliminarán con el color del administrador de entidades. De lo contrario, huérfano permanecería en DB.
- En JPA 1.0 con implementación de Hibernate cuando se establece DELETE_ORPHAN, la entidad a la que se hace referencia se elimina con flush del administrador de entidades. No es necesario llamar a remove ().
- En JPA 2.0 (en general) cuando orphanRemoval = true, la entidad a la que se hace referencia se elimina con flush of entity manager. No es necesario llamar a remove (). Si orphanRemoval no está configurado, se debe llamar a remove () para eliminar la entidad a la que se hace referencia.
Normalmente, no tienes que hacer nada como eso.
Si la colección está correctamente asignada, debe llamar a items.remove (itemToRemove) y eso es todo.
Cuando cierra el EntityManager (esto activa la escritura de cambios en la base de datos), debe reconocer automáticamente que el elemento ha sido eliminado (huérfano) del propietario y eliminarlo de la base de datos. Al menos Hibernate funciona de esta manera y uno puede especificar DELETE_ORPHAN como una cascada en el mapeo de la colección.