我想知道为什么我在试图获取一个对象的列表时会遇到这个异常,但是当列表为null时,我却遇到了惰性异常:
例如:
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
时,我变得很懒。在我的数据库中没有列表,但是我在等待null,而不是异常。
是我做错了什么,还是Hibernate就是这样工作的?
例外情况:
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)
我注意到:当我使用param中传递的会话时,我得到了惰性异常,但是当我创建一个本地会话时,它工作,但是我得到了与两个不同会话相关联的对象!
2条答案
按热度按时间mrwjdhj31#
此错误表明您正在会话关闭时访问该字段。通常,在延迟加载中会发生什么情况,因为在这种情况下事务处理是不同的。您可能需要最初仅使用提前加载来加载它。
从与下面相同的方法调用已获取集合的size()方法
rmbxnbpk2#
当我遇到这个问题时,我必须执行一个单独的查询来查看该列表是否有任何结果,如果没有任何结果,我就用
new List<>();
语句将一个空列表放入结果中,例如:这将删除由于数据库中没有该所有者的结果而标记为未初始化的hib管理列表。