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 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
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
- buscar la fila principal que se eliminará
- buscar elementos secundarios
- eliminar todos los elementos secundarios
- eliminar fila principal
- 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 ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝