【发布时间】:2016-03-30 18:43:11
【问题描述】:
我想知道为什么我在尝试获取附加到对象的对象列表时遇到此异常,但是当列表为空时我得到惰性异常:
例如:
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)
我注意到:当我使用传入参数的会话时,我得到了惰性异常,但是当我创建一个本地会话时它可以工作,但是我的对象与两个不同的会话相关联!!!
有人可以帮忙吗,我想完成这个以度过快乐的圣诞节:(
【问题讨论】:
-
同时发布异常堆栈跟踪
-
感谢 Vivek Singh,但我不想使用lazy = false,我宁愿在需要时获取它。
-
只是想评论一下,您应该避免在运行时构建查询字符串,而是使用
+连接静态或文字字符串片段。编译器将在编译时评估这些,这允许 Hibernate 快速从缓存中查找查询计划。 -
你也可以使用
(见stackoverflow.com/questions/25362831/…)
标签: java hibernate lazy-loading