JPA CascadeType.ALL ne supprime pas les orphelins

Je ne parviens pas à supprimer les nœuds orphelins à l’aide de JPA avec le mappage suivant

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") private List bikes; 

J’ai le problème des rôles orphelins qui traînent dans la firebase database.

Je peux utiliser la balise spécifique annotation org.hibernate.annotations.Cascade Hibernate mais je ne souhaite évidemment pas associer ma solution à une implémentation Hibernate.

EDIT : Il semble que JPA 2.0 inclura un support pour cela.

Si vous l’utilisez avec Hibernate, vous devrez définir explicitement l’annotation CascadeType.DELETE_ORPHAN , qui peut être utilisée conjointement avec JPA CascadeType.ALL .

Si vous ne prévoyez pas d’utiliser Hibernate, vous devrez d’abord supprimer explicitement les éléments enfants, puis supprimer l’enregistrement principal pour éviter tout enregistrement orphelin.

séquence d’exécution

  1. récupérer la ligne principale à supprimer
  2. récupérer des éléments enfants
  3. supprimer tous les éléments enfants
  4. supprimer la rangée principale
  5. Fermer la session

Avec JPA 2.0, vous pouvez maintenant utiliser l’option orphanRemoval = true

 @OneToMany(mappedBy="foo", orphanRemoval=true) 

Si vous utilisez JPA 2.0, vous pouvez désormais utiliser l’ orphanRemoval=true de l’annotation @xxxToMany pour supprimer les orphelins.

En fait, CascadeType.DELETE_ORPHAN est obsolète en 3.5.2-Final.

 ╔═════════════╦═════════════════════╦═════════════════════╗ ║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ delete ║ deletes parent ║ deletes parent ║ ║ parent ║ and orphans ║ and orphans ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ change ║ ║ ║ ║ children ║ deletes orphans ║ nothing ║ ║ list ║ ║ ║ ╚═════════════╩═════════════════════╩═════════════════════╝ 

Si vous utilisez JPA avec EclipseLink, vous devrez définir l’annotation @PrivateOwned .

Documentation: Wiki Eclipse – Utilisation des extensions JPA EclipseLink – Chapitre 1.4 Comment utiliser l’annotation @PrivateOwned

vous pouvez utiliser @PrivateOwned pour supprimer des orphelins, par exemple

 @OneToMany(mappedBy = "masterData", cascade = { CascadeType.ALL }) @PrivateOwned private List dataList; 

Selon Java Persistence avec Hibernate , la suppression orpheline en cascade n’est pas disponible en tant qu’annotation JPA.

Il n’est pas non plus pris en charge dans XML JPA.

Je trouve juste cette solution mais dans mon cas ça ne marche pas:

 @OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true n’a aucun effet.

Juste @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) .

Supprimez targetEntity = MyClass.class , cela fonctionne très bien.

J’ai eu le même problème et je me suis demandé pourquoi cette condition ci-dessous ne supprimait pas les orphelins. La liste des plats n’a pas été supprimée dans Hibernate (5.0.3.Final) lorsque j’ai exécuté une requête de suppression nommée:

 @OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true) private List dishes = new ArrayList<>(); 

Puis je me suis souvenu que je ne devais pas utiliser une requête de suppression nommée , mais EntityManager. Comme j’ai utilisé la méthode EntityManager.find(...) pour récupérer l’entité puis EntityManager.remove(...) pour la supprimer, les plats ont également été supprimés.

Pour les enregistrements, dans OpenJPA avant JPA2, il s’agissait de @ElementDependant.

J’utilisais le mappage un à un, mais l’enfant n’était pas supprimé JPA donnait une violation de clé étrangère

Après avoir utilisé orphanRemoval = true, le problème a été résolu