Стратегии, чтобы избежать Hibernate LazyInitializationExceptions - PullRequest
7 голосов
/ 19 октября 2008

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

Ответы [ 4 ]

8 голосов
/ 19 октября 2008

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

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

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

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

5 голосов
/ 20 октября 2008

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

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

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

от Кошки как кошки внутреннее соединение оставьте присоединиться к выборке cat.kittens

1 голос
/ 20 ноября 2009

Переключение на шов JBoss.

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

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

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

Walter

0 голосов
/ 27 октября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...