138 votes

JPA CascadeType.ALL ne supprime pas les orphelins

Je rencontre des problèmes lors de la suppression de noeuds orphelins en utilisant JPA avec le mappage suivant

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

Je vais avoir le problème des orphelins rôles suspendus autour de la base de données.

Je peux utiliser l'annotation org.mise en veille prolongée.les annotations.Cascade Hibernate balise spécifique, mais évidemment je ne veux pas de cravate ma solution dans hibernate mise en œuvre.

Tous les pointeurs grandement apprécié.

EDIT: Il semble JPA 2.0 inclut la prise en charge de ce projet, qui j'en suis très heureux.

167voto

Varun Mehta Points 1347

Si vous l'utilisez avec mise en veille prolongée, vous devez définir explicitement l'annotation CascadeType.DELETE_ORPHAN, qui peut être utilisé en conjonction avec JPA CascadeType.TOUS les.

Si vous ne prévoyez pas d'utiliser Hibernate, vous devez explicitement d'abord supprimer les éléments d'enfant, puis de supprimer l'enregistrement principal pour éviter tous les enregistrements orphelins.

l'ordre d'exécution des

  1. chercher ligne principale à être supprimé
  2. extraire des éléments d'enfant
  3. supprimer tous les éléments enfants
  4. supprimer la ligne principale
  5. fermer la session

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

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

113voto

Kango_V Points 1228

Si vous utilisez JPA 2.0, vous pouvez maintenant utiliser la orphanRemoval = true attribut de l’annotation @xxxToMany pour supprimer les orphelins.

En fait, CascadeType.DELETE_ORPHAN a été désapprouvée dans 3.5.2-Final.

47voto

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

12voto

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

Documentation : Eclipse Wiki - en utilisant les Extensions EclipseLink JPA - chapitre 1.4 comment utiliser l’Annotation @PrivateOwned

7voto

reshma Points 41

vous pouvez utiliser @PrivateOwned pour supprimer les orphelins par exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X