我想在持久性层中管理交易,但是当我尝试懒洋洋地获取结果时,我会收到此错误:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合

我可以使用 LockMode 或任何其他方式来解决这个问题吗?可以在没有任何事务的情况下通过 id 找到对象吗?

有帮助吗?

解决方案

您的问题是,当您尝试访问内容时,Hibernate 会话已经关闭。如果没有会话,Hibernate 无法加载内容。通常有两种方法可以缓解这个问题:

  1. 在完成该页面之前,请勿关闭会话。这种模式称为“视图中的会话”,并且可以使用 servlet 过滤器来实现。

  2. 在关闭会话之前初始化您需要的所有内容。如果你想初始化整个对象,你可以使用 Hibernate.initialize(object)。

编辑:您不能在 Hibernate 中的事务之外执行任何操作。

其他提示

您也可以看看由Hibernate在官方的解决办法 http://www.hibernate.org/43.html

典型地,该问题是延迟加载的对象的属性之一。有一两件事你可以做的是有它预装在您的查询:

这塞尔出售 其中sale.date>:的startDate 左连接抓取sale.product

此将预取的sale.product对象。

这个网站有详细信息: http://www.javalobby.org/物品/休眠查询-101 /

-Dave

有很多方法可以预取属性,因此它们在会话关闭后仍然存在:

  1. 只需调用适当的 getter 即可。将字段提取到 bean 后,会话关闭后它就在那里。
  2. 在您要使用的 JPA 中的 bean 描述符中使用适当的属性 @OneToMany(fetch = FetchType.EAGER), ,但也有类似的休眠方法可以做到这一点。
  3. 您可以在 HQL 查询中初始化字段(我不确定它在 HQL 中是否有效,但我认为可以),查找 FETCH INTO 关键词。

或者只是使用另一个ORM ......像Ebean ORM其中延迟加载只是工作:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top