web-dev-qa-db-fra.com

Quelle est la différence entre la suppression en cascade et Orphan de la base de données?

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.

69
rand0m86

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.
111
Rahul Tripathi

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.

61
study

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.

1
Mr.Q

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)

0
garg10may