JPA CascadeType.ALL no elimina huérfanos

Tengo problemas para eliminar nodos huérfanos utilizando JPA con la siguiente asignación

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") private List bikes; 

Estoy teniendo el problema de los roles huérfanos en la base de datos.

Puedo usar la anotación org.hibernate.annotations.Cascade etiqueta específica de Hibernate, pero obviamente no quiero vincular mi solución a una implementación de Hibernate.

EDITAR : Parece que JPA 2.0 incluirá soporte para esto.

Si lo está utilizando con Hibernate, deberá definir explícitamente la anotación CascadeType.DELETE_ORPHAN , que se puede usar junto con JPA CascadeType.ALL .

Si no planea usar Hibernate, primero deberá eliminar explícitamente los elementos secundarios y luego eliminar el registro principal para evitar cualquier registro huérfano.

secuencia de ejecución

  1. buscar la fila principal que se eliminará
  2. buscar elementos secundarios
  3. eliminar todos los elementos secundarios
  4. eliminar fila principal
  5. Cerrar la sesión

Con JPA 2.0, ahora puede usar la opción huérfano Remover = verdadero

 @OneToMany(mappedBy="foo", orphanRemoval=true) 

Si está utilizando JPA 2.0, ahora puede usar el orphanRemoval=true de la anotación @xxxToMany para eliminar huérfanos.

En realidad, CascadeType.DELETE_ORPHAN ha quedado obsoleto en 3.5.2-Final.

 ╔═════════════╦═════════════════════╦═════════════════════╗ ║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ delete ║ deletes parent ║ deletes parent ║ ║ parent ║ and orphans ║ and orphans ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ change ║ ║ ║ ║ children ║ deletes orphans ║ nothing ║ ║ list ║ ║ ║ ╚═════════════╩═════════════════════╩═════════════════════╝ 

Si está utilizando JPA con EclipseLink, tendrá que establecer la anotación @PrivateOwned .

Documentación: Eclipse Wiki – Uso de extensiones JPA de EclipseLink – Capítulo 1.4 Cómo usar la anotación @PrivateOwned

puede usar @PrivateOwned para eliminar huérfanos, por ejemplo

 @OneToMany(mappedBy = "masterData", cascade = { CascadeType.ALL }) @PrivateOwned private List dataList; 

Según Java Persistence with Hibernate , la eliminación huérfana en cascada no está disponible como una anotación JPA.

Tampoco es compatible con JPA XML.

Acabo de encontrar esta solución, pero en mi caso no funciona:

 @OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true no tiene ningún efecto.

Solo @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) .

Eliminar targetEntity = MyClass.class , funciona bien.

Tuve el mismo problema y me pregunté por qué esta condición a continuación no eliminó a los huérfanos. La lista de platos no se eliminó en Hibernate (5.0.3.Final) cuando ejecuté una consulta de eliminación especificada:

 @OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true) private List dishes = new ArrayList<>(); 

Entonces recordé que no debo usar una consulta de eliminación con nombre , sino el EntityManager. Como utilicé el EntityManager.find(...) para recuperar la entidad y luego EntityManager.remove(...) para eliminarla, también se eliminaron los platos.

Para los registros, en OpenJPA antes de JPA2 era @ElementDependant.

Estaba usando el mapeo uno a uno, pero el niño no estaba siendo eliminado. JPA estaba dando una violación a una clave extranjera.

Después de usar orphanRemoval = true, se resolvió el problema