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

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

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

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

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

Спасибо...

--Стив

3 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам