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%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.
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.
Tags und Links java multithreading hibernate spring lazy-loading