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

У меня есть веб-сервис, который по сути является оболочкой для DAO. Я звоню веб-службе/DAO, чтобы запросить набор сущностей.

«Родительский» класс сущностей содержит набор «дочерних» объектов сущностей, то есть связь «один ко многим». Вызов метода DAO, который извлекает «родительскую» коллекцию сущностей (т. е. myDAO.findAll()), возвращается без проблем, однако конечным результатом вызова веб-службы является следующее исключение:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Station.observations, no session or session was closed

Некоторая справочная информация:

У меня есть две сущности: Станция и Наблюдения. Объект Station ("родительский") содержит набор объектов Observations ("дочерних").

Класс DAO для сущностей Station, StationDao, имеет следующий код для вызываемого метода findAll():

private SessionFactory sessionFactory;

private Class<T> persistentClass;

public List<T> findAll()
{
    return getCurrentSession().createQuery("from " + persistentClass.getName()).list();
}

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

Кто-нибудь может подсказать, как мне обойти эту ошибку? Возможно, есть способ сохранить сеанс в течение срока действия запроса?

Заранее спасибо за вашу помощь!

--Джеймс


person James Adams    schedule 18.10.2010    source источник
comment
поиск открытой сессии в шаблоне просмотра   -  person KeatsPeeks    schedule 19.10.2010
comment
Вы можете попытаться извлечь наблюдательные данные, но если вы хотите сохранить ленивую загрузку, вы должны убедиться, что сеанс жив. Я бы посоветовал вам искать «Единица работы» и «Транзакции».   -  person zoidbeck    schedule 19.10.2010
comment
Спасибо за комментарии. Я использую подход, предложенный здесь: community.jboss.org/wiki/OpenSessioninView, но, к сожалению, когда я вхожу в код фильтра, чтобы получить текущий сеанс, я получаю сообщение об ошибке, сообщающее мне, что сеанс гибернации не привязан к потоку. Мои классы DAO аннотированы @Transactional, и я установил ‹tx:annotation-driven› в контексте своего приложения Spring на менеджер транзакций Hibernate. Может ли кто-нибудь предложить, на что еще я должен обратить внимание в качестве возможной причины моей ошибки?   -  person James Adams    schedule 19.10.2010


Ответы (1)


У меня была ситуация, когда «не удалось лениво инициализировать набор ролей» было вызвано использованием постоянных объектов после вызова

HibernateTemplate.clear()

Несмотря на то, что сеанс все еще был активен, старые объекты не были активны. Одним из возможных способов решения проблемы было повторное получение объектов из сеанса.

person Kuba    schedule 12.09.2012