NullPointerException beim Zugriff auf Lazy Loaded Collection innerhalb der DAO-Methode

8

Ich habe ein seltsames Problem mit Spring und Hibernate, wenn mehrere Threads in einer Anwendung ausgeführt werden. Ich benutze Feder 3.2.0.RELEASE und Hibernate 4.1.12.Final. Das Problem ist, dass für einige Objekte, wenn sie aus der Datenbank abgerufen werden, der Abruf erfolgreich ist, aber alle zugeordneten Auflistungen nicht festgelegt werden. Hier ist ein Beispiel für mein Repo:

%Vor%

Bei einigen Objekten gibt diese Methode immer den folgenden Fehler aus, wenn sie versucht, auf die CollectionMember-Liste zuzugreifen:

%Vor%

Das Problem besteht darin, dass der Aufruf session.get () PersistentBag-Objekte für alle Lazy-geladenen Sammlungen erstellt, den Inhalt jedoch nie festlegt. Dies tritt nur auf, wenn Multithreading aktiviert ist. Kann jemand erklären, warum das passiert?

BEARBEITEN: Hier ist das relevante Teil der foo-Klasse:

%Vor%

Und die CollectionMember-Klasse:

%Vor%     
Rockenstein 24.05.2013, 21:00
quelle

6 Antworten

2

Ich denke, Sie sollten eine dritte Join-Tabelle verwenden und Kriterien zum Laden der Sammlung verwenden.

%Vor%     
pankaj 01.05.2014 09:49
quelle
2

Problem ist @NotFound(action = NotFoundAction.IGNORE)

Dies erzeugt ein zurückgegebenes Objekt null anstelle einer leeren Sammlung, falls keine Sammlungsdatensätze gefunden werden. Entfernen und testen Sie es

    
Mahendra 26.11.2013 09:53
quelle
0

Wo kommt der Multithreading ins Spiel? Wie kann sichergestellt werden, dass ein einzelner Thread immer dieselbe Ruhezustandsitzung verwendet?

Die Art, wie ich Hibernate und Lazy loading verstehe, wenn Sie die Sammlung Hibernate durchlaufen, wird in der CurrentSession aussehen. In einer Multithread-Umgebung wurde diese Sitzung möglicherweise bereits von einem anderen Thread verwendet. Ich bin mir nicht sicher, ob @Transactional ausreicht, um die gleiche Hibernate-Sitzung zu erhalten.

Möglicherweise gibt es dafür eine Hibernate-Konfiguration.

    
Aaron 27.06.2013 20:18
quelle
0

Versuchen Sie Folgendes.

%Vor%     
Prabhakaran 18.07.2013 13:45
quelle
0

Hibernate markiert standardmäßig alle * ToMany-Auflistungszuordnungen als faul, sofern nicht anders angegeben. Es ist unmöglich, dass ein Thread das Objekt lädt und die zugehörige Lazy Collection nicht in einer einzigen @Transactional-Methode lesen kann.

Was ist Multithreading in Ihrem Fall? Spawnen Sie Threads manuell oder ist es eine Webanwendung? Wie setzen Sie Sitzungsgrenzen?

Übrigens, wenn Sie das Problem wirklich lösen wollen, würde ich Ihnen raten, den Stacktrace zu posten. Es kann nur ein paar Sekunden dauern, um Ihre kommerziellen Paketnamen zu ersetzen, falls es Probleme gibt.

    
Gregory Klimov 13.10.2013 19:11
quelle
0

Wenn Sie den Ruhezustand in der Frühlingsumgebung verwenden, ist es nicht empfehlenswert, die Sitzung direkt über die Sitzungsfabrik zu erhalten, da dies zu einem Sitzleck führen kann. Versuchen Sie, das folgende Muster zu ersetzen:

%Vor%     
Slava L 15.10.2013 22:42
quelle