with manytomany many intermediate ejemplo column java jpa

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:


Gracias chicos por las respuestas. Sus respuestas son muy similares, pero hay algunas diferencias leves.

Solo quiero asegurarme de que lo entiendo bien:

  1. 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.
  2. 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 ().
  3. 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.