Je rencontre des difficultés pour supprimer des nœuds orphelins à l'aide de 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 dans la base de données.
Je peux utiliser la org.hibernate.annotations.Cascade
balise d' annotation spécifique à Hibernate mais je ne veux évidemment pas lier ma solution à une implémentation Hibernate.
EDIT : Il semble que JPA 2.0 inclura un support pour cela.
Si vous utilisez JPA 2.0, vous pouvez désormais utiliser l'
orphanRemoval=true
attribut de l'@xxxToMany
annotation pour supprimer les orphelins.En fait,
CascadeType.DELETE_ORPHAN
a été obsolète dans 3.5.2-Final.la source
la source
cascade = CascadeType.ALL, orphanRemoval = false
et supprime le parent? Va-t-il supprimer les enfants, même si j'ai spécifiquement dit de NE PAS le faire?Si vous utilisez JPA avec EclipseLink, vous devrez définir l' annotation @PrivateOwned .
Documentation: Eclipse Wiki - Utilisation des extensions JPA EclipseLink - Chapitre 1.4 Comment utiliser l'annotation @PrivateOwned
la source
vous pouvez utiliser @PrivateOwned pour supprimer les orphelins, par exemple
la source
Je trouve juste cette solution mais dans mon cas ça ne marche pas:
orphanRemoval = true n'a aucun effet.
la source
Selon Java Persistence with Hibernate , la suppression d'orphelin en cascade n'est pas disponible en tant qu'annotation JPA.
Il n'est pas non plus pris en charge dans JPA XML.
la source
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:
Ensuite, je me suis souvenu que je ne devais pas utiliser une requête de suppression nommée , mais le EntityManager. Comme j'ai utilisé la
EntityManager.find(...)
méthode pour récupérer l'entité, puisEntityManager.remove(...)
pour la supprimer, les plats ont également été supprimés.la source
Juste
@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
.Supprimez targetEntity = MyClass.class , cela fonctionne très bien.
la source
Pour mémoire, dans OpenJPA avant JPA2, c'était @ElementDependant.
la source
J'utilisais un mappage un à un, mais l'enfant ne se faisait pas supprimer JPA donnait une violation de clé étrangère
Après avoir utilisé orphanRemoval = true, le problème a été résolu
la source