1

我想在我的持久层中管理一个事务,但是当我尝试懒惰地获取结果时,我得到了这个错误:

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

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

4

5 回答 5

3

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

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

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

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

于 2009-04-23T13:58:39.410 回答
2

您还可以在 http://www.hibernate.org/43.html 查看hibernate 的官方解决方案

于 2009-04-23T17:06:14.753 回答
0

通常问题是对象的属性之一是延迟加载的。您可以做的一件事是将其预加载到您的查询中:

从 Sale sale where sale.date > :startDate left join fetch sale.product

这将预取 sale.product 对象。

该站点有更多信息:http ://www.javalobby.org/articles/hibernate-query-101/ 。

-戴夫

于 2009-04-23T14:20:57.050 回答
0

有很多方法可以预取属性,所以它们在会话关闭后就在那里:

  1. 只需调用适当的吸气剂。将字段提取到 bean 后,会话关闭后它就在那里。
  2. 在您将使用的 JPA 中的 bean 描述符中使用适当的属性@OneToMany(fetch = FetchType.EAGER),但是有类似的休眠方式可以做到这一点。
  3. 您可以在 HQL 查询中初始化字段(我不确定它是否适用于 HQL,但我认为可以),查找FETCH INTO关键字。
于 2009-05-05T20:39:30.427 回答
0

或者只是使用另一个 ORM ...比如 Ebean ORM,延迟加载可以工作:)

于 2009-11-11T11:04:53.247 回答