2015-12-24 1 views
2

Мне интересно, почему я получаю это исключение, пытаясь получить список объектов, привязанных к объекту, но вместо этого я получаю ленивое исключение, когда список равен null:не удалось лениво инициализировать коллекцию, когда нет значения в DB

Например:

protected static final String hqlRequest = "select user from User as user"; 

final StringBuilder sbHqlRequest = new StringBuilder(hqlRequest); 
sbHqlRequest.append(" left outer join fetch user.listeCondition as condition");  
sbHqlRequest.append(" left outer join fetch user.listeReponse as reponse"); 
sbHqlRequest.append(" left outer join fetch reponse.listeCat reponseCat"); 
sbHqlRequest.append(" left outer join fetch reponseCat.listeDomain listeDomain"); 
sbHqlRequest.append(" left outer join fetch reponse.listePlan reponsePlan"); 


sbHqlRequest.append(" where user.identifiant=? "); 
return (User) session.createQuery(sbHqlRequest.toString()).setInteger(0, identifiant.intValue()).uniqueResult(); 

Я получаю ленивый при попытке получить доступ к reponseCat.listeDomain. В моей БД нет списка, но я ждал нулевого, а не исключения.

Я делаю что-то неправильно или это то, как работает Hibernate?

Спасибо.

EDIT: Исключение:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Cat.listeDomain - no session or session was closed 
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:191) 
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:183) 
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:48) 
at org.hibernate.collection.PersistentSet.isEmpty(PersistentSet.java:118) 
at org.apache.commons.collections.CollectionUtils.isEmpty(CollectionUtils.java:979) 
at org.apache.commons.collections.CollectionUtils.isNotEmpty(CollectionUtils.java:992) 

Я noticied, что: когда я использую сеанс прошел в парах, я получаю ленивое исключение, но когда я создаю локальный сеанс он работает, но я получаю мои объекты связанных с двумя разными сессиями !!!

Может кто-то плз помочь, я хочу закончить это пройти счастливого Рождества :(

+1

также отправляет трассировку стека исключений –

+0

Возможный дубликат [Спящий режим Нет сеанса или сеанса закрыты «когда я пытаюсь получить данные из базы данных») (http://stackoverflow.com/questions/13264799/hibernate-no- session-or-session-was-closed-when-i-try-to-get-data-from-data) –

+0

Спасибо Vivek Singh, но я не хочу использовать lazy = false, я бы предпочел бы его получить, когда Мне это нужно. – Kirikou

ответ

0

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

вызвать метод размера() на извлеченной коллекции из той же методы, как показано ниже

User user = (User) session.createQuery(sbHqlRequest.toString()).setInteger(0, identifiant.intValue()).uniqueResult(); 
user.getListeDomain().size(); 
user.getListeCondition().size(); 
.... 
//other collections 
return user; 
+0

Вот почему я не могу понять, сессия никогда не закрывалась. В противном случае я бы не смог получить все другие коллекции и прочее! – Kirikou

+0

После выполнения запроса и продолжения сеанса сеанс закрывается самим спящим режимом. Вы можете сделать одно из действий при вызове метода size() в listeDomain после того, как вы получите объект пользователя в том же методе, из которого вы выполняете запрос. –

+0

Я не знал, что спящий режим закрывает сеанс сам, когда я двигаюсь дальше, спасибо за информацию. Но я все еще не понимаю, как я могу получить другие коллекции? с той же сессией! – Kirikou

0

Когда я столкнулся с этой проблемой я должен был выполнить сепарат e, чтобы узнать, есть ли у этого списка какие-либо результаты. Если у него не было никаких результатов, я поместил пустой список в результат с оператором new List<>();. Так, например:

List<> result = query.setParameter(0, owner.id).getResultList(); 
if (result.size() > 0) 
    owner.setList(result); 
else 
    owner.setList(new List<>()); 

Это удаляет гибернации управляемый список, который помечен как не инициализируется, потому что не было никаких результатов для этого владельца в базе данных.