проблема отложенной инициализации hibernate: LazyInitializationException: не удалось лениво инициализировать коллекцию ролей - PullRequest
0 голосов
/ 23 апреля 2009

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

org.hibernate.LazyInitializationException: не удалось лениво инициализировать набор ролей

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

Ответы [ 5 ]

2 голосов
/ 23 апреля 2009

Вы также можете посмотреть официальное решение от Hibernate на http://www.hibernate.org/43.html

2 голосов
/ 23 апреля 2009

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

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

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

edit: Вы не можете ничего сделать вне транзакции в Hibernate.

0 голосов
/ 11 ноября 2009

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

0 голосов
/ 06 мая 2009

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

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

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

от продажи продажа где sale.date>: startDate оставьте присоединиться к выборке sale.product

Это будет предварительно извлекать объект sale.product.

этот сайт имеет больше информации: http://www.javalobby.org/articles/hibernate-query-101/.

-Dave

...