2008-10-18 3 views
7

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

+0

Hibernate 4.1.6 решает следующее: http://stackoverflow.com/questions/578433/how-to-solve-lazy-initialization-exception-using-jpa-and-hibernate-as-provider/11913404#11913404 – andreak 2012-08-11 09:14:38

ответ

8

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

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

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

Что касается недостатков OpenSessionInView, вы проверили this?

5

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

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

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

от кота, как кот внутреннего соединения принести cat.mate оставил присоединиться выборками cat.kittens

1

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

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

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

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

Walter

0

Оракул Java учебники указывают, что «Корпоративные компоненты поддерживают транзакции, механизмы, которые управляют параллельным доступом к совместно используемым объектам.» Поэтому, чтобы справиться с проблемами Lazy Fetch, я создаю сессионный компонент без состояния Java, а затем получаю все вспомогательные классы, которые мне нужны, прежде чем возвращаться из метода. Oracle также упоминает это как основной шаблон J2EE «Фаза фасада сеанса». Эти методы кажутся намного лучшими практиками применения, чем некоторые из упомянутых выше.