Ленивая загрузка в Hibernate - PullRequest
       22

Ленивая загрузка в Hibernate

2 голосов
/ 01 февраля 2010

Мое веб-приложение на Java использует Hibernate для выполнения ORM. В некоторых моих объектах я использую ленивую загрузку, чтобы избежать получения данных, пока они мне абсолютно не понадобятся. Проблема в том, что я загружаю исходный объект в сеанс, а затем этот сеанс уничтожается. Когда я позже пытаюсь разрешить загруженные коллекции в моем объекте, я получаю следующую ошибку:

org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: common.model.impl.User.groups, ни один сеанс или сеанс не был закрыт

Я попытался связать новый сеанс с коллекцией и затем разрешить, но это дает те же результаты.

Кто-нибудь знает, как я могу разрешить ленивые коллекции, когда исходный сеанс закончился?

Спасибо ...

- Стив

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Три варианта:

  1. вызывайте Hibernate.initialize(..) в вашей коллекции, когда она собирается отключиться от текущего сеанса

  2. объявить коллекцию как FetchType.EAGER

  3. merge(..) ваш пользовательский объект обратно в новый сеанс

2 голосов
/ 02 февраля 2010

Прежде чем получить доступ к неинициализированным коллекциям или другим прокси, вам нужно прикрепить ранее загруженный объект к новому Session с merge() или lock(). Я не знаю, как вы это сделали в вашем случае, но факт в том, что ваш User все еще был отсоединен, когда вы пытались получить его groups.

1 голос
/ 17 марта 2011

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

Паскаль дал ответ о том, как повторно прикрепить объекты к новому сеансу.

Другой вариант - изменить способ обработки сеансов. В нашем приложении мы также используем Spring и позволяем Spring управлять сессиями Hibernate для нас. Это обеспечивает хорошую часть решения, но вам все равно придется время от времени повторно присоединять объекты, что является лишь частью способа использования Hibernate в веб-средах.

...