Cuál es la diferencia entre
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
y
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Este ejemplo es del Tutorial de Java EE, pero todavía no entiendo los detalles.
java
jpa
cascading-deletes
rand0m86
fuente
fuente
Respuestas:
Desde aquí : -
fuente
Una forma sencilla de comprender la diferencia entre
CascadeType.REMOVE
yorphanRemoval=true
.Para eliminación de huérfanos: si invoca
setOrders(null)
, lasOrder
entidades relacionadas se eliminarán en db automáticamente.Para eliminar cascada: si invoca
setOrders(null)
, lasOrder
entidades relacionadas NO se eliminarán en db automáticamente.fuente
Supongamos que tenemos una entidad secundaria y una entidad matriz. Un padre puede tener varios hijos.
OrphanRemoval es un concepto ORM, indica si el niño es huérfano. también debe eliminarse de la base de datos.
Un niño queda huérfano cuando no se puede acceder a él desde su padre. Por ejemplo, si eliminamos el conjunto de objetos Persona (configurándolo en un conjunto vacío) o lo reemplazamos con un conjunto nuevo, el padre ya no podrá acceder a los hijos del conjunto anterior y los hijos quedarán huérfanos, por lo que los hijos están condenados a ser eliminado en la base de datos también.
CascadeType.REMOVE es un concepto de nivel de base de datos e indica si se elimina el padre, todos sus registros relacionados en la tabla secundaria deben eliminarse.
fuente
Prácticamente, la diferencia radica en si está intentando actualizar los datos (PATCH) o reemplazarlos por completo (PUT)
Supongamos que elimina el
customer
que el usocascade=REMOVE
también eliminará los pedidos de los clientes que parecen intencionados y útiles.Ahora digamos que actualiza un
customer
conorphanRemoval="true"
eliminará todos los pedidos anteriores y los reemplazará con el proporcionado. (PUT
en términos deREST API
)Sin
orphanRemoval
viejos pedidos se mantendrían. (PATCH
en términos deREST API
)fuente
CascadeType.REMOVE
La
CascadeType.REMOVE
estrategia, que puede configurar explícitamente:o heredarlo implícitamente de la
CascadeType.ALL
estrategia:le permite propagar la
remove
operación de la entidad principal a sus entidades secundarias.Entonces, si buscamos la
Post
entidad padre junto con sucomments
colección y eliminamos lapost
entidad:Hibernate ejecutará tres declaraciones de eliminación:
Las
PostComment
entidades secundarias se eliminaron debido a laCascadeType.REMOVE
estrategia, que actuó como si también elimináramos las entidades secundarias.La estrategia de remoción de huérfanos
La estrategia de eliminación de huérfanos, que debe establecerse mediante el
orphanRemoval
atributo:le permite eliminar la fila de la tabla secundaria al eliminar la entidad secundaria de la colección.
Entonces, si cargamos la
Post
entidad junto con sucomments
colección y eliminamos la primeraPostComment
de lacomments
colección:Hibernate ejecutará una instrucción DELETE para la
post_comment
fila de la tabla asociada :Para obtener más detalles sobre este tema, consulte también este artículo .
fuente