Je rencontre le problème suivant lorsque j'essaie de mettre à jour mon entité:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
J'ai une entité parent et elle a une Set<...>
des entités enfants. Quand j'essaye de le mettre à jour, j'obtiens toutes les références à placer à ces collections et le place.
Le code suivant représente mon mappage:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
J'ai essayé de nettoyer l'ensemble <..> uniquement, en fonction de ceci: comment résoudre "possible" le problème, mais cela n'a pas fonctionné.
Si vous avez des idées, faites-le moi savoir.
Merci!
java
hibernate
hibernate-mapping
axcdnt
la source
la source
something.manyother.remove(other)
simanyother
est unList<T>
. Faire beaucoup d'autres Mutable, aimerArrayList<T>
et utiliserorphanDelete = true
Réponses:
Vérifiez tous les endroits où vous attribuez quelque chose à sonEntities. Le lien que vous avez référencé indique clairement la création d'un nouveau HashSet, mais vous pouvez rencontrer cette erreur chaque fois que vous réaffectez l'ensemble. Par exemple:
Habituellement, vous ne voulez que "nouveau" l'ensemble une fois dans un constructeur. Chaque fois que vous souhaitez ajouter ou supprimer quelque chose à la liste, vous devez modifier le contenu de la liste au lieu d'attribuer une nouvelle liste.
Pour ajouter des enfants:
Pour retirer des enfants:
la source
La méthode:
fonctionne si le
parentEntity
est détaché et à nouveau si nous le mettons à jour.Mais si l'entité n'est pas détachée de chaque contexte (c'est-à-dire que les opérations de recherche et de mise à jour sont dans la même transaction), la méthode ci-dessous fonctionne.
la source
Quand j'ai lu à divers endroits que hibernation n'aimait pas que vous assigniez à une collection, j'ai supposé que la chose la plus sûre à faire serait évidemment de la rendre finale comme ceci:
Cependant, cela ne fonctionne pas et vous obtenez l'erreur redoutée "n'est plus référencée", ce qui est en fait assez trompeur dans ce cas.
Il s'avère que hibernate appelle votre méthode setRoles ET veut que sa classe de collection spéciale soit installée ici, et n'acceptera pas votre classe de collection. Cela m'a laissé perplexe pendant longtemps, malgré la lecture de tous les avertissements concernant la non-affectation à votre collection dans votre méthode définie.
J'ai donc changé pour ceci:
Ainsi, lors du premier appel, hibernate installe sa classe spéciale, et lors des appels suivants, vous pouvez utiliser la méthode vous-même sans tout détruire. Si vous voulez utiliser votre classe comme bean, vous avez probablement besoin d'un setter fonctionnel, et cela semble au moins fonctionner.
la source
List<String> list = new ArrayList<>();
. Le changer pourList<String> list = null;
résoudre le problème :)En fait, mon problème concernait les égaux et le code de hachage de mes entités. Un code hérité peut apporter beaucoup de problèmes, n'oubliez jamais de le vérifier. Tout ce que j'ai fait, c'est de conserver la stratégie de suppression des orphelins et de corriger les égaux et le code de hachage.
la source
J'ai eu la même erreur. Le problème pour moi était qu'après avoir enregistré l'entité, la collection mappée était toujours nulle et lors de la tentative de mise à jour de l'entité, l'exception était levée. Ce qui m'a aidé: enregistrer l'entité, puis faire un rafraîchissement (la collection n'est plus nulle) et ensuite effectuer la mise à jour. Peut-être que l'initialisation de la collection avec un nouveau ArrayList () ou quelque chose pourrait aussi aider.
la source
A UN TYPE DE RELATION:
N'essayez pas d'instancier la collection lorsqu'elle est déclarée dans
hasMany
, ajoutez et supprimez simplement des objets.UTILISER LE TYPE DE RELATION:
Mais la collection ne peut être nulle que lorsqu'elle est déclarée en tant que propriété (relation d'utilisation) et n'est pas initialisée dans la déclaration.
la source
J'ai utilisé l'approche @ user2709454 avec une petite amélioration.
la source
J'ai eu ce problème lors de l'utilisation
TreeSet
. J'ai initialiséoneToMany
avecTreeSet
quels travauxMais cela apportera l'erreur décrite
question
ci - dessus. Il semble donc quehibernate
pris en chargeSortedSet
et si l'on change simplement la ligne ci-dessus pourça marche comme par magie :) plus d'infos sur
hibernate SortedSet
peut être icila source
La seule fois où j'obtiens cette erreur, c'est lorsque j'essaie de passer NULL dans le setter pour la collection. Pour éviter cela, mes setters ressemblent à ceci:
la source
J'ai rencontré cela lors de la mise à jour d'une entité avec une demande de publication JSON. L'erreur s'est produite lorsque j'ai mis à jour l'entité sans données sur les enfants, même lorsqu'il n'y en avait pas. Ajouter
au corps de la demande a résolu le problème.
la source
Une autre cause peut être l'utilisation de lombok.
@Builder
- fait économiserCollections.emptyList()
même si vous dites.myCollection(new ArrayList());
@Singular
- ignore les valeurs par défaut du niveau de classe et laisse le champnull
même si le champ de classe a été déclaré commemyCollection = new ArrayList()
Mes 2 cents, je viens de passer 2 heures avec le même :)
la source
Je devenais
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
quand je me mettaisparent.setChildren(new ArrayList<>())
. Quand j'ai changé pourparent.getChildren().clear()
, cela a résolu le problème.Vérifiez pour plus de détails: HibernateException - Une collection avec cascade = "all-delete-orphan" n'était plus référencée par l'instance d'entité propriétaire .
la source
J'utilise Spring Boot et j'ai eu ce problème avec une collection, bien que je ne l'écrase pas directement, car je déclare un champ supplémentaire pour la même collection avec un sérialiseur et désérialiseur personnalisé afin de fournir une représentation plus conviviale du Les données:
Il semble que même si je n'écrase pas la collection moi - même , la désérialisation le fait sous le capot, ce qui déclenche tout de même ce problème. La solution était de changer le setter associé au désérialiseur afin qu'il efface la liste et ajoute tout, plutôt que de l'écraser:
la source
J'ai eu le même problème, mais c'était lorsque l'ensemble était nul. Uniquement dans la collection Set dans la recherche de travail List. Vous pouvez essayer d'annoter la mise en veille prolongée @LazyCollection (LazyCollectionOption.FALSE) au lieu de l'annotation JPA fetch = FetchType.EAGER.
Ma solution: c'est ma configuration et ça marche bien
la source
J'ai rencontré la même erreur lorsque j'ajoutais un objet enfant à la liste existante d'objets enfants.
Ce qui a résolu mon problème passe à:
Maintenant, l'enfant est ravivé avec d'autres détails et cela a bien fonctionné.
la source
Ajout de ma réponse stupide. Nous utilisons Spring Data Rest. C'était notre relation assez standard. Le modèle a été utilisé ailleurs.
Avec la relation que nous avons créée, il était toujours prévu que les enfants soient ajoutés par le biais de leur propre repo. Je n'avais pas encore ajouté le repo. Le test d'intégration que nous avons effectué passait par un cycle de vie complet de l'entité via des appels REST afin que les transactions se ferment entre les demandes. Aucun repo pour l'enfant signifiait que le json avait les enfants dans le cadre de la structure principale au lieu d'en
_embedded
. Les mises à jour du parent entraîneraient alors des problèmes.la source
La solution suivante a fonctionné pour moi
la source
Au lieu d'attribuer une nouvelle collection
Remplacer tous les éléments par
la source
attention à
Cette méthode brise également l'hibernation.
la source
Cela pourrait être causé par
hibernate-enhance-maven-plugin
. Lorsque j'ai activé laenableLazyInitialization
propriété, cette exception a commencé à se produire sur ma collection paresseuse. J'utilise hibernate 5.2.17.Final.Notez ces deux problèmes d'hibernation:
la source
Le mien était complètement différent avec Spring Boot! Pour moi, ce n'était pas dû à la définition de la propriété de la collection.
Dans mes tests, j'essayais de créer une entité et j'obtenais cette erreur pour une autre collection qui n'était pas utilisée!
Après tant d'essais, je viens d'ajouter un
@Transactional
sur la méthode de test et il l'a résolu. Mais n'en avez pas la raison.la source
Ceci est en contraste avec les réponses précédentes, j'ai eu exactement la même erreur: "Une collection avec cascade =" all-delete-orphan "n'était plus référencée ...." quand ma fonction setter ressemblait à ceci:
Et puis il a disparu quand je l'ai changé en version simple:
(versions d'hibernation - essayé à la fois 5.4.10 et 4.3.11. Passé plusieurs jours à essayer toutes sortes de solutions avant de revenir à l'affectation simple dans le setter. Confus maintenant quant à pourquoi cela.)
la source