JPA CascadeType.Tout ne supprime pas les orphelins

j'ai du mal à supprimer les noeuds orphelins en utilisant JPA avec le mappage suivant

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

j'ai la question des rôles orphelins autour de la base de données.

je peux utiliser l'annotation org.hibernate.annotations.Cascade Hibernate étiquette spécifique, mais évidemment je ne veux pas lier ma solution dans une mise en œuvre D'hibernation.

EDIT : il semble que JPA 2.0 comprendra un support pour cela.

118
demandé sur rtruszk 2008-11-20 20:31:32

11 réponses

si vous L'utilisez avec Hibernate, vous devrez explicitement définir l'annotation CascadeType.DELETE_ORPHAN , qui peut être utilisé en conjonction avec JPA CascadeType.ALL .

si vous n'avez pas L'intention 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. lecture de la ligne principale d'être supprimé
  2. extraire des éléments d'enfant
  3. supprimer tous les éléments pour 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)
144
répondu Varun Mehta 2015-12-16 12:39:03

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

en fait, CascadeType.DELETE_ORPHAN a été déprécié au 3.5.2-Final.

108
répondu Kango_V 2016-04-08 22:40:09
╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝
43
répondu Sergii Shevchyk 2013-12-05 07:22:58

si vous utilisez JPA avec EclipseLink, vous devrez mettre l'annotation @Privateownered .

Documentation: Eclipse Wiki-Using EclipseLink JPA Extensions-Chapter 1.4 How to Use the @Privateownered Annotation

12
répondu uı6ʎɹnɯ ꞁəıuɐp 2009-09-01 12:01:22

vous pouvez utiliser @private owned pour supprimer les orphelins E. g

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
7
répondu reshma 2011-07-08 11:03:04

Selon Java Persistance avec Hibernate , cascade orphelin supprimer n'est pas disponible en tant que JPA annotation.

il n'est pas non plus pris en charge dans JPA XML.

4
répondu toolkit 2008-11-20 17:38:10

je trouve juste cette solution mais dans mon cas elle ne fonctionne pas:

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

orphanRemoval = true n'a pas d'effet.

4
répondu Valéry Stroeder 2012-01-31 13:02:07

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

Remove targetEntity = MyClass.classe , c'est du bon travail.

2
répondu Kohan95 2012-01-31 13:27:44

j'ai eu le même problème et je me suis demandé pourquoi cette condition ci-dessous n'a pas supprimé les orphelins. La liste des plats N'a pas été supprimée en hibernation (5.0.3.Final) lorsque j'ai exécuté une requête de suppression de nom:

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

puis je me suis souvenu que je ne doit pas utiliser un nom supprimer la requête , mais L'EntityManager. Comme j'ai utilisé la méthode EntityManager.find(...) pour récupérer l'entité et puis EntityManager.remove(...) pour la supprimer, les plats ont été supprimés aussi.

2
répondu Bevor 2015-11-01 17:39:06

pour les archives, dans OpenJPA avant JPA2 c'était @Elementdependent.

1
répondu Simone Gianni 2011-05-18 16:35:15

j'utilisais un à un mappage, mais l'enfant ne se faisait pas supprimer JPA donnait violation de clé étrangère

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

0
répondu vipin chauhan 2016-01-13 06:27:17