Строка StaleObjectstateException была обновлена или удалена

Я добираюсь, это исключение в контроллере веб-приложения на основе пружинного использования платформы в спящем режиме. Я попробовал много способов противостоять этому, но не мог разрешить его.

В методе контроллера, handleRequestInternal, существуют вызовы, выполненные к базе данных главным образом для 'чтения', если это не отправлять действие. Я использовал, Сессия Spring, но переместился в getHibernateTemplate() и проблема все еще остается.

в основном это второй вызов к базе данных выдает это исключение. Это:

1) getEquipmentsByNumber(number) {во-первых оборудование выбирается от DB на основе 'числа', которое имеет список свойств, и каждое свойство имеет список значений. Я циклично выполняюсь через те значения (Строки элементарных объектов) для чтения в в переменные),

2) getMaterialById(id) {материалы выборок на основе идентификатора}

Я действительно понимаю, что второй вызов, по всей вероятности, действительно ли создание является сессией для "сбрасывания", но я только 'читаю' объекты, затем почему делает второй вызов, выдает устаревшее объектное исключение состояния на свойстве оборудования, если нет ничего измененного?

Я не могу очистить кэш после вызова, так как он вызывает LazyExceptions на объектах, которые я передаю представлению.

Я считал это: https://forums.hibernate.org/viewtopic.php? f=1&t=996355&start=0, но не мог решить проблему на основе обеспеченных предложений.

Как я могу решить эту проблему? Любые идеи и мысли ценятся.

ОБНОВЛЕНИЕ: То, что я просто протестировал, является этим в функции getEquipmentsByNumber() после чтения переменных из списка свойств я делаю это: getHibernateTemplate().flush(); и теперь исключение находится на этой строке скорее затем вызов для выборки материала (который является getMaterialById(id)).

ОБНОВЛЕНИЕ: Перед явным называнием сброса я удаляю объект из кэша сессии так, чтобы никакой устаревший объект не оставался в кэше.

getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();

Хорошо, поэтому теперь проблема переместилась в следующую выборку из DB после того, как я сделал это. Я предполагаю, что должен маркировать методы, как синхронизируется и выселить Объекты, как только я закончен, читая их содержание! это не звучит очень хорошим.

ОБНОВЛЕНИЕ: сделанный handleRequestInternal метод "синхронизируется". Ошибка исчезла. Конечно, не лучшее решение, но что сделать! Попробованный в handleRequestInternal закрыть текущий сеанс и открыть новый. Но это заставило бы другие части приложения не работать правильно. Попробованный для использования ThreadLocal это не работало также.

16
задан Tom11 24 February 2016 в 10:26
поделиться

1 ответ

С этой проблемой я уже сталкивался и был весьма разочарован, хотя в ваших вызовах DAO/Hibernate должно быть что-то немного странное, потому что если вы выполняете поиск по ID, то нет причин для получения устаревшего состояния, поскольку это всего лишь простой поиск объекта.

Во-первых, убедитесь, что все ваши методы аннотированы @Transaction(required=true) // вам придется поискать точный синтаксис

Однако это исключение обычно возникает, когда вы пытаетесь внести изменения в объект, который был отсоединен от сессии, из которой он был извлечен. Решение этой проблемы часто не простое и требует больше кода, чтобы мы могли увидеть, что именно происходит; мое общее предложение - создать @Service, который выполняет подобные вещи в рамках одной транзакции

0
ответ дан 30 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: