java repository - JPA CascadeType.ALL ne supprime pas les orphelins





merge vs (11)


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

Il n'est également pas pris en charge dans JPA XML.

J'ai des difficultés à supprimer des noeuds orphelins en utilisant JPA avec le mappage suivant

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

J'ai le problème des rôles orphelins qui traînent autour de la base de données.

Je peux utiliser l'annotation org.hibernate.annotations.Cascade Hibernate tag spécifique mais évidemment je ne veux pas lier ma solution dans une implémentation Hibernate.

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




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



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

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



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 les enregistrements orphelins.

séquence d'exécution

  1. aller chercher la ligne principale à supprimer
  2. récupérer des éléments enfants
  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)






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

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




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




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

Enlevez targetEntity = MyClass.class , c'est très bien.




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.




J'ai eu le même problème et je me demandais pourquoi cette condition ci-dessous n'a pas supprimé 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<Dish> dishes = new ArrayList<>();

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




Je voudrais juste ajouter que @JoinColumn ne doit pas toujours être lié à l' emplacement de l'information physique comme this réponse le suggère. Vous pouvez combiner @JoinColumn avec @OneToMany même si la table parent n'a pas de données de table pointant vers la table enfant.

Comment définir une relation OneToMany unidirectionnelle dans l'APP

UnToMany unidirectionnel, aucun Inverse ManyToOne, aucune table de jointure

Il semble être seulement disponible dans JPA 2.x+ cependant. C'est utile pour les situations où vous voulez que la classe enfant contienne simplement l'ID du parent, pas une référence complète.







java hibernate orm jpa jpa-2.0