Как решить LazyInitializationException при использовании JPA и Быть в спящем режиме

Во время выполнения вы всегда получите правильный класс. Стирание типа происходит во время компиляции, когда компилятор генерирует байт-код. Когда тип не ограничен, компилятор заменяется на Object, а когда он ограничен, он заменяется верхней границей. Вы можете получить подробную информацию о стирании типов в этом уроке https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html

50
задан Vlad Mihalcea 31 January 2018 в 23:19
поделиться

3 ответа

LazyInitializationException подразумевает вызов набора после того, как быть в спящем режиме сессия закрылась, или после того, как объект был отсоединен от сессии.

необходимо или повторно прикрепить объект быть в спящем режиме сессия, изменить место, где Вы называете набор или перемещаете границу того, где сеанс закрыт к более высокому слою.

8
ответ дан Daniel Alexiuc 7 November 2019 в 10:43
поделиться

OpenSessionInView является одним шаблоном для контакта с этой проблемой. Некоторая информация здесь:

http://www.hibernate.org/43.html

Вы захотите быть осторожными при реализации этого шаблона и понять последствия. Каждый раз, когда Вы перемещаетесь по ленивой ассоциации в представлении, оно исчерпает другой SQL-запрос для загрузки данных. Если Ваши варианты использования таковы, что число и размер этих SQL-запросов являются небольшими затем, это не может иметь значения. Удостоверьтесь, что как минимум Вы корректируете свои настройки входа, таким образом, Вы видите, какие запросы В спящем режиме, "волшебно" выполняется в фоновом режиме, чтобы Вы загрузили данные.

Также рассматривают вид приложения, которое Вы пишете. Если Вы не имеете дело с дистанционной работой (никакие веб-сервисы, никакой ОСНОВАННЫЙ НА AJAX веб-клиент) затем, OSIV может работать очень приятно. Однако, если сериализатор дистанционной работы начнет обходить весь граф объектов, то он, вероятно, инициирует смешное количество SQL-запросов и нанесет вред Вашему серверу БД и серверу приложений.

5
ответ дан cliff.meyers 7 November 2019 в 10:43
поделиться

Существует много способов предварительной выборки свойств , поэтому они присутствуют после закрытия сеанса:

  1. Вызвать соответствующий геттер. После того, как поле загружено в компонент, оно остается там после закрытия сеанса.
  2. Вы можете инициализировать поле в запросе EJBQL, ищите ключевое слово JOIN FETCH .
  3. Включите AvailableSettings.ENABLE_LAZY_LOAD_NO_TRANS, если вы используете версию Hibernate, которая его поддерживает.

Некоторые проблемы могут возникнуть, когда вы попробуете следующие решения:

  1. Вызов геттеров может быть оптимизирован JIT-компилятором (иногда это занимает некоторое время).
  2. Сущности, которые вы пытаетесь ПРИСОЕДИНЯТЬСЯ к FETCH , могут быть связаны через несколько отношений типа «многие» с участием List. В этом случае результирующий запрос возвращает неоднозначные результаты, и Hibernate откажется получить ваши данные в одном запросе.
  3. Уже существует одна интересная ошибка, связанная с AvailableSettings.ENABLE_LAZY_LOAD_NO_TRANS . И их будет больше, потому что, как говорят ребята из спящего режима: Примечание: это может произойти вне транзакции и небезопасно. Используйте с осторожностью. В основном вы сами по себе.

Лучше всего сначала попробовать JOIN FETCH . Если это не сработает, попробуйте метод получения. Если JIT-компилятор ошибся во время выполнения, присвойте результат общедоступному статическому изменчивому объекту .

Или прекратите использование Hibernate ...

16
ответ дан 7 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

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