Стратегии, позволяющие избежать исключений Hibernate LazyInitializationExceptions

Есть ли другие способы избежать LazyInitializationExceptions в веб-приложении Hibernate, кроме использования шаблона OpenSessionInView? Есть ли недостатки в использовании OpenSessionInView?

Hibernate 4.1.6 решает эту проблему: stackoverflow.com/questions/578433/…

andreak 11.08.2012 13:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
1
1 903
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

При работе с нашими веб-приложениями мы обычно заранее решаем, какие объекты / поля потребуются на страницах представления, и перед отправкой в ​​представление проверяем, что все объекты должным образом инициализированы из модели.

Это можно сделать (как минимум) тремя способами:

  1. Свойства получение с использованием стратегии нетерпения (т.е. с FetchMode.JOIN, если вы используете API критериев)
  2. явная инициализация свойств (т.е. с Hibernate.initialize(property))
  3. неявная инициализация свойств путем вызова соответствующего метода доступа к свойству

О недостатках OpenSessionInView, вы проверяли страницу это?

Обычно это лучший способ справиться с проблемой, не принимая глобальное решение об активной выборке; заключается в использовании ключевого слова "выборка" в сочетании с запросом hql.

От http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html

Кроме того, соединение «выборка» позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с помощью единственного выбора. Это особенно полезно в случае коллекции. Он эффективно переопределяет внешнее соединение и ленивые объявления файла сопоставления для ассоциаций и коллекций. См. Раздел 19.1, «Стратегии выборки» для получения дополнительной информации.

от кота как кота внутреннее соединение fetch cat.mate левый присоединиться получить кот. котят

Переключитесь на JBoss Seam.

Фреймворк Seam хорошо спроектирован ребятами, которые разработали Hibernate.

Даже с открытым сеансом в просмотре у вас могут возникнуть некоторые проблемы. В зависимости от сложности вашего веб-приложения Open Session In View не обрабатывает все случаи. У меня также были проблемы с отображением данных (в пользовательском интерфейсе) в качестве выборки объектов во время кварцевого задания, такого как отправка электронного письма.

Hibernate уже интеллектуально извлекает данные, изменение режима выборки приведет к снижению производительности. Более того, вы уходите от условностей и засоряете свой проект посторонними деталями конфигурации.

Уолтер

В руководствах Oracle Java указывается, что «корпоративные компоненты поддерживают транзакции, механизмы, управляющие одновременным доступом к разделяемым объектам». Итак, чтобы справиться с проблемами отложенной выборки, я создаю сессионный компонент Java без сохранения состояния, а затем получаю все необходимые подклассы, прежде чем вернуться из метода. Oracle также называет это базовым шаблоном J2EE "Session Façade". Эти практики кажутся намного лучшими практиками применения, чем некоторые из упомянутых выше.

Другие вопросы по теме