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 provient du didacticiel Java EE, mais je ne comprends toujours pas les détails.
De ici : -
Cascading Supprimer
Le fait de marquer un champ de référence avec CascadeType.REMOVE (ou CascadeType.ALL, Qui inclut REMOVE) indique que les opérations de suppression devraient être. en cascade automatiquement vers les objets d'entité référencés par ce champ (plusieurs objets d'entité peuvent être référencés par un champ collection ):
@Entity class Employee { : @OneToOne(cascade=CascadeType.REMOVE) private Address address; : }
Suppression d'orphelin
JPA 2 prend en charge un mode de suppression en cascade supplémentaire plus agressif qui peut être spécifié en utilisant l’élément orphanRemoval du fichier Annotations @OneToOne et @OneToMany:
@Entity class Employee { : @OneToOne(orphanRemoval=true) private Address address; : }
DIFFÉRENCE:-
La différence entre les deux paramètres réside dans la réponse à déconnecter une relation. Par exemple, comme lors du réglage de champ adresse à null ou à un autre objet adresse.
- Si orphanRemoval = true est spécifié, l'instance d'adresse déconnectée est automatiquement supprimée. Ceci est utile pour nettoyer objets dépendants (par exemple, Adresse) qui ne devraient pas exister sans un référence d'un objet propriétaire (par exemple, Employé).
- Si seul cascade = CascadeType.REMOVE est spécifié, aucune action automatique n'est entreprise car la déconnexion d'une relation n'est pas une suppression.
opération.
Un moyen facile de comprendre la différence entre CascadeType.REMOVE
et orphanRemoval=true
.
Pour la suppression orpheline: Si vous appelez setOrders(null)
, les entités Order
associées seront automatiquement supprimées de la base de données.
Pour remove cascade: Si vous appelez setOrders(null)
, les entités Order
associées ET NON seront automatiquement supprimées de la base de données.
Supposons que nous ayons une entité enfant et une entité parent. Un parent peut avoir plusieurs enfants.
@Entity
class parent {
//id and other fields
@OneToMany (orphanRemoval = "true",cascade = CascadeType.REMOVE)
List<Personnel> myChildernList;
}
orphanRemoval est un concept ORM, il indique si l'enfant est orphelin. il devrait également être supprimé de la base de données.
Un enfant est orphelin quand il ne peut pas y accéder depuis son parent . Par exemple, si nous supprimons obj à l’index i (à l’aide de myChildernList.remove (i)) ou si nous le définissons à null ou si nous le remplaçons par un nouvel ( personnelList.set (i, newChild)) alors le parent ne peut plus accéder à cet enfant et celui-ci est orphelin; l'enfant est donc condamné à être supprimé de la base de données également (c'est déchirant :()
CascadeType.REMOVE est un concept de niveau base de données et indique si le parent est supprimé, tous les enregistrements associés de la table enfant doivent être supprimés.
Pratiquement, la différence réside dans le fait que vous essayiez de mettre à jour les données (PATCH) ou de les remplacer entièrement (PUT)
Supposons que vous supprimiez la customer
puis que cascade=REMOVE
supprime également les commandes des clients qui semblent voulues et utiles.
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
Maintenant, supposons que vous mettiez à jour une customer
avec orphanRemoval="true"
elle supprimera toutes les commandes précédentes et les remplacera par celle fournie. (PUT
en termes de REST API
)
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Sans orphanRemoval
les anciens ordres seraient conservés. (PATCH
en termes de REST API
)