Die Initialisierung der Lazy-Sammlung schlägt im Ruhezustand fehl

8

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.

    
Alexz 10.09.2013, 16:55
quelle

1 Antwort

13

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() )

%Vor%

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

%Vor%

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.

    
Sotirios Delimanolis 10.09.2013 16:59
quelle