hibernate延迟初始化问题:LazyInitializationException:懒得初始化一个角色集合

时间:2009-04-23 13:37:23

标签: java hibernate lazy-initialization

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

  

org.hibernate.LazyInitializationException:懒得初始化角色集合

我可以使用LockMode或其他任何方式解决此问题吗? 可以通过ID找到一个没有任何事务的对象吗?

5 个答案:

答案 0 :(得分:2)

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

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

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

  3. 编辑:你不能在Hibernate的事务之外做任何事情。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

通常问题是对象的一个​​属性是延迟加载的。您可以做的一件事是在查询中预先加载它:

来自销售促销 sale.date> :开始日期 left join fetch sale.product

这将预取sale.product对象。

此网站提供了更多信息:http://www.javalobby.org/articles/hibernate-query-101/

-Dave

答案 3 :(得分:0)

预取属性的方法有很多种,所以在会话结束后它们就在那里:

  1. 只需拨打适当的getter即可。在将字段提取到bean之后,会话关闭后就会存在。
  2. 在您使用@OneToMany(fetch = FetchType.EAGER)的JPA中的bean描述符中使用适当的属性,但有类似的hibernate方法。
  3. 您可以在HQL查询中初始化字段(我不确定它是否在HQL中有效,但我认为确实如此),查找FETCH INTO关键字。

答案 4 :(得分:0)

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