Beim Versuch, meine Entität zu aktualisieren, tritt das folgende Problem auf:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
Ich habe eine übergeordnete Entität und es hat eine Set<...>
von einigen untergeordneten Entitäten. Wenn ich versuche, es zu aktualisieren, erhalte ich alle Referenzen, die auf diese Sammlungen gesetzt werden sollen, und setze es.
Der folgende Code repräsentiert meine Zuordnung:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
Ich habe nur versucht, das Set <..> zu reinigen, wie folgt: Wie "möglich" das Problem zu lösen, aber es hat nicht funktioniert.
Wenn Sie Ideen haben, lassen Sie es mich bitte wissen.
Vielen Dank!
java
hibernate
hibernate-mapping
axcdnt
quelle
quelle
something.manyother.remove(other)
ifmanyother
is aList<T>
. Machen Sie viele andere veränderlich, wieArrayList<T>
und verwenden SieorphanDelete = true
Antworten:
Überprüfen Sie alle Stellen, an denen Sie sonEntities etwas zuweisen. Der Link, auf den Sie verwiesen haben, weist deutlich darauf hin, dass ein neues HashSet erstellt wurde. Dieser Fehler kann jedoch jederzeit auftreten, wenn Sie den Satz neu zuweisen. Beispielsweise:
Normalerweise möchten Sie die Menge nur einmal in einem Konstruktor "neu" machen. Jedes Mal, wenn Sie der Liste etwas hinzufügen oder löschen möchten, müssen Sie den Inhalt der Liste ändern, anstatt eine neue Liste zuzuweisen.
So fügen Sie Kinder hinzu:
So entfernen Sie Kinder:
quelle
Die Methode:
funktioniert, wenn das getrennt
parentEntity
ist und erneut, wenn wir es aktualisieren.Wenn die Entität jedoch nicht pro Kontext getrennt ist (dh Such- und Aktualisierungsvorgänge befinden sich in derselben Transaktion), funktioniert die folgende Methode.
quelle
Als ich an verschiedenen Stellen las, an denen Sie im Winterschlaf nicht gerne einer Sammlung zugeordnet wurden, ging ich davon aus, dass es am sichersten wäre, sie wie folgt endgültig zu machen:
Dies funktioniert jedoch nicht und Sie erhalten den gefürchteten Fehler "nicht mehr referenziert", der in diesem Fall tatsächlich ziemlich irreführend ist.
Es stellt sich heraus, dass der Ruhezustand Ihre setRoles-Methode aufruft UND die spezielle Auflistungsklasse hier installiert werden soll und Ihre Auflistungsklasse nicht akzeptiert. Dies hat mich für eine LANGE Zeit verblüfft, obwohl ich alle Warnungen gelesen habe, dass ich Ihrer Sammlung in Ihrer festgelegten Methode nicht zugewiesen habe.
Also habe ich folgendes geändert:
Damit Hibernate beim ersten Aufruf seine spezielle Klasse installiert und bei nachfolgenden Aufrufen die Methode selbst verwenden kann, ohne alles zu zerstören. Wenn Sie Ihre Klasse als Bean verwenden möchten, benötigen Sie wahrscheinlich einen funktionierenden Setter, und dies scheint zumindest zu funktionieren.
quelle
List<String> list = new ArrayList<>();
. Ändern Sie es, umList<String> list = null;
das Problem zu beheben :)Eigentlich ging es bei meinem Problem um Gleichheit und Hashcode meiner Entitäten. Ein Legacy-Code kann viele Probleme mit sich bringen. Vergessen Sie niemals, ihn zu überprüfen. Alles, was ich getan habe, war, die Strategie zum Löschen und Verwaisen beizubehalten und Gleichheits- und Hashcode zu korrigieren.
quelle
Ich hatte den gleichen Fehler. Das Problem für mich war, dass nach dem Speichern der Entität die zugeordnete Sammlung immer noch null war und beim Versuch, die Entität zu aktualisieren, die Ausnahme ausgelöst wurde. Was mir geholfen hat: Speichern Sie die Entität, führen Sie eine Aktualisierung durch (Sammlung ist nicht mehr null) und führen Sie dann die Aktualisierung durch. Vielleicht hilft auch das Initialisieren der Sammlung mit neuem ArrayList () oder etwas anderem.
quelle
HAT BEZIEHUNGSTYP:
Versuchen Sie nicht, die Sammlung zu instanziieren, wenn sie in deklariert ist. Fügen Sie
hasMany
einfach Objekte hinzu und entfernen Sie sie.VERWENDUNGSBEZIEHUNGSTYP:
Die Auflistung kann jedoch nur dann null sein, wenn sie als Eigenschaft deklariert ist (Verwendungsbeziehung) und in der Deklaration nicht initialisiert wird.
quelle
Ich habe den @ user2709454-Ansatz mit kleinen Verbesserungen verwendet.
quelle
Ich hatte dieses Problem beim Versuch zu verwenden
TreeSet
. Ich habe initialisiert,oneToMany
mitTreeSet
welchen ArbeitenDies führt jedoch zu dem
question
oben beschriebenen Fehler . So scheint es, dasshibernate
unterstütztSortedSet
und wenn man nur die obige Zeile auf ändertes funktioniert wie Magie :) Weitere Informationen
hibernate SortedSet
finden Sie hierquelle
Ich erhalte diesen Fehler nur, wenn ich versuche, NULL an den Setter für die Sammlung zu übergeben. Um dies zu verhindern, sehen meine Setter folgendermaßen aus:
quelle
Ich bin darauf gestoßen, als ich eine Entität mit einer JSON-Post-Anfrage aktualisiert habe. Der Fehler trat auf, als ich die Entität ohne Daten zu den untergeordneten Elementen aktualisierte, auch wenn keine vorhanden waren. Hinzufügen
an die Anfrage Stelle löste das Problem.
quelle
Eine andere Ursache kann die Verwendung von Lombok sein.
@Builder
- verursacht zu sparen,Collections.emptyList()
auch wenn Sie sagen.myCollection(new ArrayList());
@Singular
- ignoriert die Standardeinstellungen auf Klassenebene und verlässt das Feld,null
auch wenn das Klassenfeld als deklariert wurdemyCollection = new ArrayList()
Meine 2 Cent, habe gerade 2 Stunden mit dem gleichen verbracht :)
quelle
Ich bekam,
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
als ich einstellteparent.setChildren(new ArrayList<>())
. Als ich zu wechselteparent.getChildren().clear()
, löste es das Problem.Überprüfen Sie weitere Details: HibernateException - Eine Auflistung mit cascade = "all-delete-orphan" wurde von der Instanz der besitzenden Entität nicht mehr referenziert .
quelle
Ich verwende Spring Boot und hatte dieses Problem mit einer Sammlung, obwohl ich es nicht direkt überschrieben habe, da ich ein zusätzliches Feld für dieselbe Sammlung mit einem benutzerdefinierten Serializer und Deserializer deklariere , um eine frontendfreundlichere Darstellung der Sammlung zu ermöglichen Daten:
Es scheint , dass , obwohl ich nicht die Sammlung zu überschreiben mich , die Deserialisierung es unter der Haube hat, die Auslösung dieses Problems alle gleich. Die Lösung bestand darin, den dem Deserializer zugeordneten Setter so zu ändern, dass die Liste gelöscht und alles hinzugefügt wird, anstatt sie zu überschreiben:
quelle
Ich hatte das gleiche Problem, aber es war, als der Satz null war. Nur in der Set-Sammlung in List Arbeit finden. Sie können versuchen, die Annotation @LazyCollection (LazyCollectionOption.FALSE) für den Ruhezustand zu aktivieren, die von der JPA-Annotation fetch = FetchType.EAGER installiert wurde.
Meine Lösung: Dies ist meine Konfiguration und funktioniert einwandfrei
quelle
Der gleiche Fehler trat auf, als ich der vorhandenen Liste der untergeordneten Objekte ein untergeordnetes Objekt hinzufügte.
Was mein Problem gelöst hat, ändert sich zu:
Jetzt belebt sich das Kind auch mit anderen Details und es hat gut funktioniert.
quelle
Meine dumme Antwort hinzufügen. Wir verwenden Spring Data Rest. Dies war unsere ziemlich normale Beziehung. Das Muster wurde an anderer Stelle verwendet.
Mit der Beziehung, die wir aufgebaut haben, war es immer beabsichtigt, dass die Kinder durch ihr eigenes Repo hinzugefügt werden. Ich hatte das Repo noch nicht hinzugefügt. Der Integrationstest, den wir hatten, durchlief über REST-Aufrufe einen vollständigen Lebenszyklus der Entität, sodass die Transaktionen zwischen den Anforderungen geschlossen wurden. Kein Repo für das Kind bedeutete, dass der json die Kinder als Teil der Hauptstruktur anstelle von in hatte
_embedded
. Aktualisierungen des übergeordneten Elements würden dann Probleme verursachen.quelle
Die folgende Lösung hat bei mir funktioniert
quelle
Anstatt eine neue Sammlung zuzuweisen
Ersetzen Sie alle Elemente durch
quelle
sei vorsichtig mit
Auch diese Methode unterbricht den Ruhezustand.
quelle
Es könnte verursacht werden durch
hibernate-enhance-maven-plugin
. Als ich dieenableLazyInitialization
Eigenschaft aktiviert habe, trat diese Ausnahme in meiner Lazy-Sammlung auf. Ich verwende den Ruhezustand 5.2.17.Final.Beachten Sie diese beiden Probleme im Ruhezustand:
quelle
Meins war mit Spring Boot ganz anders! Für mich lag es nicht daran, die Sammlungseigenschaft festzulegen.
In meinen Tests habe ich versucht, eine Entität zu erstellen, und diesen Fehler für eine andere Sammlung erhalten, die nicht verwendet wurde!
Nachdem ich so viel versucht hatte, fügte ich einfach eine
@Transactional
Testmethode hinzu und sie löste sie. Aber nicht den Grund.quelle
Dies steht im Gegensatz zu den vorherigen Antworten, ich hatte genau den gleichen Fehler: "Eine Sammlung mit cascade =" all-delete-orphan "wurde nicht mehr referenziert ...", als meine Setter-Funktion so aussah:
Und dann verschwand es, als ich es auf die einfache Version änderte:
(Versionen im Ruhezustand - haben sowohl 5.4.10 als auch 4.3.11 ausprobiert. Wir haben mehrere Tage damit verbracht, alle möglichen Lösungen auszuprobieren, bevor wir zu der einfachen Zuordnung im Setter zurückgekehrt sind. Wir sind jetzt verwirrt, warum dies so ist.)
quelle