我想在我的持久层中管理一个事务,但是当我尝试懒惰地获取结果时,我得到了这个错误:
org.hibernate.LazyInitializationException:未能延迟初始化角色集合
我可以使用 LockMode 或任何其他方式来解决这个问题吗?可以在没有任何事务的情况下通过其 id 找到对象吗?
我想在我的持久层中管理一个事务,但是当我尝试懒惰地获取结果时,我得到了这个错误:
org.hibernate.LazyInitializationException:未能延迟初始化角色集合
我可以使用 LockMode 或任何其他方式来解决这个问题吗?可以在没有任何事务的情况下通过其 id 找到对象吗?
您的问题是当您尝试访问内容时,休眠会话已经关闭。Hibernate 无法在没有会话的情况下加载内容。通常有两种方法可以缓解这个问题:
在完成页面之前不要关闭会话。这种模式称为“视图中的会话”,例如可以使用 servlet 过滤器来实现。
在关闭会话之前初始化您需要的所有内容。如果要初始化整个对象,可以使用 Hibernate.initialize(object)。
编辑:您不能在 Hibernate 中的事务之外执行任何操作。
通常问题是对象的属性之一是延迟加载的。您可以做的一件事是将其预加载到您的查询中:
从 Sale sale where sale.date > :startDate left join fetch sale.product
这将预取 sale.product 对象。
该站点有更多信息:http ://www.javalobby.org/articles/hibernate-query-101/ 。
-戴夫
有很多方法可以预取属性,所以它们在会话关闭后就在那里:
@OneToMany(fetch = FetchType.EAGER)
,但是有类似的休眠方式可以做到这一点。FETCH INTO
关键字。或者只是使用另一个 ORM ...比如 Ebean ORM,延迟加载可以工作:)