Meine Annahme ist, dass Hibernate Ihren Setter mit seiner eigenen Implementierung von Set (PersistentSet) aufruft, die Lazy-Loading implementiert und noch nicht initialisiert ist, wenn der Setter aufgerufen wird. Da Sie eine Methode für diese Gruppe aufrufen, lädt sie die Gruppe selbst, während sie sich bereits in einer Ladephase befindet, wodurch Hibernate in einen inkonsistenten Zustand versetzt wird.
Deshalb bevorzuge ich den Feldzugriff über den Eigenschaftszugriff (d. h. setze alle Mapping-Annotationen auf Felder und nicht auf Getters). Sie möchten eine Kopie des übergebenen Satzes erstellen, wenn die Methode mit "normalem" Code aufgerufen wird, aber Sie möchten dies nicht tun, wenn Hibernate selbst den Setter aufruft: Es bricht vollständig das Lazy-Loading ab.
Sie übergeben null
als Argument der Methode, also for-jedes Konstrukt löst eine Ausnahme aus. Benutze eine Schutzbedingung und alles geht gut:
aber ich bevorzuge:
%Vor%Von javadoc :
Beim Zugriff auf eine Eigenschaft einer Instanz von a ist ein Problem aufgetreten persistente Klasse durch Reflexion oder über CGLIB. Es gibt eine Reihe von mögliche zugrunde liegende Ursachen, einschließlich
%Vor%
Ich würde sagen, this.tags
(Feld) oder tags
(Parameter) ist null
, aber um es herauszufinden, können Sie den gesamten Stack-Trace drucken, dies würde auf die Ursache hinweisen.
Das herauszufinden ist am einfachsten, wenn Sie die Interna von setTags in einen try-Catch einbinden und alle Ausnahmen mit dem von Ihnen gewählten Protokollierungssystem protokollieren.
Meine erste Vermutung ist, dass die Variablenvariable der Tags null ist. Ich wäre sehr überrascht, wenn das nicht der Fall wäre, aber es sollte trivial sein, einen Debugger in einem Integrationstest zu verifizieren
Meine zweite Vermutung wäre, dass das Argument, das an setTags () übergeben wurde, nicht korrekt initialisiert wird, oder null ist, oder irgendeine Art von Ausnahme auslöst, wenn Ihre for-Schleife versucht, darauf zu iterieren.