Quelle est la différence entre
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
et
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Cet exemple est tiré du didacticiel Java EE, mais je ne comprends toujours pas les détails.
java
jpa
cascading-deletes
rand0m86
la source
la source
Réponses:
D' ici : -
la source
Un moyen simple de comprendre la différence entre
CascadeType.REMOVE
etorphanRemoval=true
.Pour la suppression des orphelins: si vous appelez
setOrders(null)
, lesOrder
entités associées seront supprimées automatiquement dans la base de données.Pour supprimer la cascade: si vous appelez
setOrders(null)
, lesOrder
entités associées ne seront PAS supprimées automatiquement dans la base de données.la source
Supposons que nous ayons une entité enfant et une entité parent. Un parent peut avoir plusieurs enfants.
OrphanRemoval est un concept ORM, il indique si l'enfant est orphelin. il doit également être supprimé de la base de données.
Un enfant est orphelin lorsqu'il n'est pas accessible depuis son parent. Par exemple, si nous supprimons l'ensemble d'objets Personne (en le définissant sur un ensemble vide) ou le remplaçons par un nouvel ensemble, le parent ne peut plus accéder aux enfants de l'ancien ensemble et les enfants sont orphelins, donc les enfants sont condamnés à être supprimé dans la base de données également.
CascadeType.REMOVE est un concept au niveau de la base de données et il indique si le parent est supprimé, tous ses enregistrements associés dans la table enfant doivent être supprimés.
la source
Pratiquement, la différence réside dans le fait que vous essayez de mettre à jour les données (PATCH) ou de remplacer entièrement les données (PUT)
Supposons que vous supprimiez le
customer
que l'utilisationcascade=REMOVE
supprimera également les commandes des clients qui semblent intentionnelles et utiles.Maintenant, disons que vous mettez à jour un
customer
avecorphanRemoval="true"
cela supprimera toutes les commandes précédentes et les remplacera par celle fournie. (PUT
en termes deREST API
)Sans les
orphanRemoval
anciennes commandes seraient conservées. (PATCH
en termes deREST API
)la source
CascadeType.REMOVE
La
CascadeType.REMOVE
stratégie, que vous pouvez configurer explicitement:ou l'hériter implicitement de la
CascadeType.ALL
stratégie:vous permet de propager l'
remove
opération de l'entité parente vers ses entités enfants.Donc, si nous récupérons l'
Post
entité parente avec sacomments
collection et supprimons l'post
entité:Hibernate va exécuter trois instructions de suppression:
Les
PostComment
entités enfants ont été supprimées en raison de laCascadeType.REMOVE
stratégie, qui a agi comme si nous supprimions également les entités enfants.La stratégie d'élimination des orphelins
La stratégie de suppression des orphelins, qui doit être définie via l'
orphanRemoval
attribut:vous permet de supprimer la ligne de la table enfant lors de la suppression de l'entité enfant de la collection.
Donc, si nous chargeons l'
Post
entité avec sacomments
collection et supprimons la premièrePostComment
de lacomments
collection:Hibernate va exécuter une instruction DELETE pour la
post_comment
ligne de table associée :Pour plus de détails sur ce sujet, consultez également cet article .
la source