2009-04-23 4 views
0

Я хочу управлять Сделкой в ​​моей персистентности Но когда я пытаюсь принести результаты лениво, я получаю эту ошибку:зимуют ленивые проблемы initilization

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

Могу ли я использовать LockMode или любой другой способ решить эту проблему Эта проблема? Может ли найти объект по его идентификатору без какой-либо транзакции?

ответ

2

Ваша проблема в том, что сеанс Hibernate уже закрыт, когда вы пытаетесь получить доступ к контенту. Спящий режим не может загружать контент без сеанса. Обычно существует два способа смягчения этой проблемы:

  1. Не закрывайте сеанс, пока не закончите со страницей. Этот шаблон называется «сеансом в представлении» и может быть, например, реализован с помощью фильтра сервлета.

  2. Инициализируйте все содержимое, которое вам нужно до закрытия сеанса. Если вы хотите инициализировать весь объект, вы можете использовать Hibernate.initialize (object).

Редактировать: Вы не можете ничего сделать за пределами транзакции в спящем режиме.

+0

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

0

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

от продажи продажи где sale.date>: STARTDATE LEFT JOIN выборки sale.product

Это будет заранее получить продажу. продукт.

Этот сайт имеет более подробную информацию: http://www.javalobby.org/articles/hibernate-query-101/.

-Dave

0

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

  1. Просто позвоните соответствующему получателю. После того, как поле будет загружено в bean-компонент, оно будет после закрытия сессии.
  2. Используйте соответствующий атрибут в бин-дескрипторе в JPA, вы должны использовать @OneToMany(fetch = FetchType.EAGER), но есть аналогичные способы спящего режима.
  3. Вы можете инициализировать поле в запросе HQL (я не уверен, что он работает в HQL, но я думаю, что это так), ищите ключевое слово FETCH INTO.
0

Или просто использовать другой ORM ... как Ebean ОРМ, где отложенная загрузка просто работает :)

Смежные вопросы