Hibernate LazyInitializationException: не удалось лениво инициализировать коллекцию ролей - PullRequest
0 голосов
/ 19 октября 2010

У меня есть веб-сервис, который по сути является оболочкой для 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 («родитель») содержит коллекцию объектов наблюдения («потомков»).

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

private SessionFactory sessionFactory;

private Class<T> persistentClass;

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

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

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

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

- Джеймс

1 Ответ

0 голосов
/ 12 сентября 2012

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

HibernateTemplate.clear()

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

...