【问题标题】:Hibernate 4. could not initialize proxy - no SessionHibernate 4. 无法初始化代理 - 没有会话
【发布时间】: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


【解决方案1】:

您必须在会话仍处于打开状态时急切地获取所有这些实体,或者您必须为返回列表的使用者保持会话打开,并且仅在他完成构建树时关闭它。您正在加载充满延迟加载实体的列表,然后关闭会话,然后将其发送到其他代码,这些代码将尝试遍历该列表以构建树 - 当然它会抱怨会话已经关闭。

【讨论】:

  • 感谢@ClayFowler,我完全理解你。重新表述我的问题:是否有可能打破绑定或将我的对象与其代理分离,以便它可以用于构建选项的子集?感谢您的帮助!
  • 要么在会话仍然打开时构建树,要么急切地获取所有内容以返回到外部树构建器。
猜你喜欢
  • 2012-11-09
  • 2010-11-15
  • 1970-01-01
  • 2014-01-14
  • 2020-06-07
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
相关资源
最近更新 更多