Ленивая загрузка в Hibernate
Мое веб-приложение Java использует Hibernate для выполнения ORM. В некоторых моих объектах я использую ленивую загрузку, чтобы избежать получения данных, пока они мне абсолютно не понадобятся. Проблема в том, что я загружаю исходный объект в сеанс, а затем этот сеанс уничтожается. Когда я позже пытаюсь разрешить загруженные коллекции в моем объекте, я получаю следующую ошибку:
org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: common.model.impl.User.groups, ни один сеанс или сеанс не был закрыт
Я попытался связать новый сеанс с коллекцией и затем разрешить, но это дает те же результаты.
Кто-нибудь знает, как я могу разрешить ленивые коллекции, когда исходная сессия прошла?
Спасибо...
--Стив
3 ответа
Три варианта:
вызов
Hibernate.initialize(..)
в вашей коллекции, когда она собирается отключиться от текущей сессииобъявить коллекцию как
FetchType.EAGER
merge(..)
ваш пользовательский объект обратно в новый сеанс
Прежде чем получить доступ к неинициализированным коллекциям или другим прокси, вам необходимо прикрепить ранее загруженный объект к новому Session
с merge()
или же lock()
, Я не знаю, как вы это сделали в вашем случае, но дело в том, что ваш User
был все еще оторван, когда вы пытались получить его groups
,
У вас есть несколько вариантов, но основная проблема заключается в том, что вам нужно либо расширить сеанс, либо повторно присоединить ваши объекты к сеансу.
Паскаль дал ответ о том, как повторно прикрепить объекты к новому сеансу.
Другой вариант - изменить способ обработки сессий. В нашем приложении мы также используем Spring и позволяем Spring управлять сессиями Hibernate для нас. Это обеспечивает хорошую часть решения, но вам все равно придется время от времени повторно прикреплять объекты, что является лишь частью способа использования Hibernate в веб-средах.