remove orphanremoval onetoone eliminar cascadetype java hibernate orm jpa jpa-2.0

orphanremoval - jpa java crud



JPA CascadeType.ALL no elimina huérfanos (11)

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> 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.


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.


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


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


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.


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.



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)


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<Dish> 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.


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

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


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