Heute habe ich mit dem nächsten Problem im Winterschlaf konfrontiert:
Meine Methode:
%Vor%Methode initializeIssues:
%Vor%Ich erhalte eine Ausnahme, wenn die Sammlung Punkte defaultPeriod
enthält %Vor%Aber wenn ich einige Zeilen entferne und die Methode zu
ändere %Vor%Es funktioniert gut.
Ich debuggte das erste Beispiel und die Hibernate-Sitzung wird während der gesamten Methode nicht geschlossen.
Wie ich weiß, hat das geladene Objekt (ein Element in Punkte ) in der Sitzung eine Sammlung, die der aktiven Sitzung zugeordnet ist und vor dem Objekt existiert ( defaultPeriod ) - Es ( defaultPeriod ) verliert seine Zuordnung.
Ist es wahr? Wer hat noch das gleiche Problem?
Danke für die Antworten.
Vermutlich stammt Ihr Team
-Argument von einer anderen Transaktion und einem anderen Hibernate Session
.
Wenn eine @Transactional
-Methode zurückkehrt, schließt TransactionManager
die Session
, die einige Bereinigungen und Unsets durchführt (setzt auf null
), das Session
-Feld aller PersistentCollection
-Instanzen. Ihr defaultPeriod
hat eines davon im Feld issues
.
Hibernate Hibernate.initialize()
erzwingt die Initialisierung eines lazy PersistentCollection
, hat aber den folgenden Code (Aufrufe AbstractPersistentCollection#forceInitialization()
)
Wenn Sie die issues
-Auflistung außerhalb der ursprünglichen @Transactional
-Methode (dem Code, der Team
erzeugt) verwenden möchten, müssen Sie die zugrunde liegenden Objekte laden. Entweder ändern Sie es in EAGER laden oder tun Sie, was Sie mit Hibernate.initialize()
tun.
Eine andere Lösung ist, dass Session
länger als nur die Länge des ersten @Transactional
dauert, aber ich habe keine Details dafür. Eine schnelle Google- oder SO-Suche sollte einige Optionen aufzeigen.
Dies ist was passiert
%Vor% erhält ein Objekt Period
mit der ID (zB) 42
. Weil es in einem anderen Session
passiert ist, das seitdem geschlossen wurde, ist issues
ein PersistentCollection
, das einen null
Session
Verweis hat, und wirft den Exception
, den du bekommst.
Das machst du
%Vor% Nehmen wir an, die List
enthält ein Objekt Period
mit der ID 42
, also die if
in
wird nicht ausgeführt. Obwohl equals()
true
zurückgibt ( contains()
gibt auch true
zurück und wird false
wegen !
), sind die Objekte nicht identisch. Das on in List
hat eine angehängte (nicht null) Session
, so dass eine initialisiert werden kann. Aber deine, die von defaultPeriod
gehalten wird, kann nicht.
Tags und Links java hibernate collections lazy-initialization