hibernate 当数据库中没有值时,无法延迟初始化集合

yk9xbfzb  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(128)

我想知道为什么我在试图获取一个对象的列表时会遇到这个异常,但是当列表为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中传递的会话时,我得到了惰性异常,但是当我创建一个本地会话时,它工作,但是我得到了与两个不同会话相关联的对象!

mrwjdhj3

mrwjdhj31#

此错误表明您正在会话关闭时访问该字段。通常,在延迟加载中会发生什么情况,因为在这种情况下事务处理是不同的。您可能需要最初仅使用提前加载来加载它。
从与下面相同的方法调用已获取集合的size()方法

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

rmbxnbpk2#

当我遇到这个问题时,我必须执行一个单独的查询来查看该列表是否有任何结果,如果没有任何结果,我就用new List<>();语句将一个空列表放入结果中,例如:

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

这将删除由于数据库中没有该所有者的结果而标记为未初始化的hib管理列表。

相关问题