Otrzymuję ten wyjątek w kontrolerze aplikacji WWW opartej na wiosennej strukturze przy użyciu hibernacji. Próbowałem na wiele sposobów, aby temu przeciwdziałać, ale nie mogłem go rozwiązać.Wiersz StaleObjectstateException został zaktualizowany lub usunięty przez
W metodzie sterownika, handleRequestInternal
, są wywoływane do bazy danych głównie dla "czytaj", chyba że jest to akcja przesyłania. Używam Spring sesji, ale przeniósł się do getHibernateTemplate()
i problem nadal pozostaje.
zasadniczo to drugie wywołanie bazy danych zgłasza ten wyjątek. To jest:
1) getEquipmentsByNumber(number)
{pierwsze będący urządzeniem jest pobierany z DB w oparciu o „numer”, który ma listę właściwości, a każda posiada listę wartości. I pętli tych wartości (prymitywne obiekty Struny) do odczytu w zmiennych)
2) getMaterialById(id)
{pobiera materiały w oparciu o ID}
Rozumiem, że drugie wezwanie, najprawdopodobniej, czyni sesję do "flush", ale ja tylko "czytam" obiekty, to dlaczego drugie wywołanie rzuca wyjątek stanu przestarzałych obiektów na własności Equipment, jeśli nic się nie zmieni?
Nie mogę wyczyścić pamięci podręcznej po wywołaniu, ponieważ powoduje ona LazyExceptions na obiektach, które przekazuję do widoku.
Przeczytałem: https://forums.hibernate.org/viewtopic.php?f=1&t=996355&start=0 , ale nie udało się rozwiązać problemu w oparciu o dostarczone sugestie.
Jak mogę rozwiązać ten problem? Wszelkie pomysły i przemyślenia są doceniane.
UPDATE: Co ja właśnie testowane jest to, że w funkcji getEquipmentsByNumber()
po przeczytaniu zmiennych z listy właściwości, mogę to zrobić: getHibernateTemplate().flush();
i teraz wyjątek na tej linii, a następnie wezwanie do pobierania materiału (czyli to getMaterialById(id)
).
UPDATE: Przed jawne wywołanie równo, jestem usunięcie obiektu z pamięci podręcznej sesji tak, że nie zestarzeć obiekt pozostaje w pamięci podręcznej.
getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();
OK, więc teraz problem został przeniesiony do następnego sprowadzić z DB po Zrobiłem to. Przypuszczam, że muszę oznaczać metody jako zsynchronizowane i eksmitować obiekty, jak tylko skończę czytać ich zawartość! to nie brzmi zbyt dobrze.
UPDATE: Wykonane metodą handleRequestInternal
"zsynchronizowane". Błąd zniknął. Oczywiście, nie najlepsze rozwiązanie, ale co robić! Próbowano w handleRequestInternal
zamknąć bieżącą sesję i otworzyć nową. Ale spowoduje to, że inne części aplikacji nie będą działać poprawnie. Próbowałem użyć ThreadLocal
, który też nie działał.
jeśli mógłbyś opublikować kod metody, która rzuca wyjątek, przyjrzę się temu dalej. Brzmi trochę podejrzanie – walnutmon