【发布时间】:2012-10-02 21:17:04
【问题描述】:
我知道这个错误很常见,但我已经搜索过,但似乎没有任何效果。
我在 Option 实体中有递归关系(childrenOptions, parentOption - 作为延迟加载),我正在通过 HQL 查询加载平面列表,如下所示:
Session session = sessionFactory.openSession();
session.beginTransaction();
List result = session.createQuery("from Option as o").list();
session.getTransaction().commit();
session.close();
return result;
我正在尝试在 Hibernate 会话之外手动构建用户的选项树,因为它依赖于之前加载的其他角色实体。
所以,当我尝试使用 getChildrenOptions() 属性来添加子选项时,我收到 “无法初始化代理 - 无会话” 错误。
我已经尝试过session.evict()和.getHibernateLazyInitializer().getImplementation(),但是
if (option instanceof HibernateProxy)
总是假的。
是否有可能无法/删除此代理行为并使用普通 POJO 之类的集合属性?
急切加载所有选项似乎是性能问题,我想自己构建树。
提前致谢。
【问题讨论】:
-
在你完成你的工作之前不要关闭会话就足够了。
-
感谢@dierre,如果会话仍然打开,我认为 Hibernate 会访问数据库并在 getChildrenOptions().add(...) 行延迟加载 childrenOptions 集合;基本上我已经在内存中过滤了选项(对不起,这在简化的 hql 中并不明显),我需要做的就是构建树。
-
也许我的answer 会帮助你。
标签: hibernate lazy-loading lazy-initialization