2009-04-23 73 views
0

我想在我的持久层管理事务, 但是当我尝试懒洋洋地获取结果我得到这个错误:冬眠懒动初始化问题

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

我可以使用LockMode或任何其他方式来解决这个问题? 没有任何交易可以通过它的id找到一个对象?

回答

2

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

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

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

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

+0

谢谢。我知道这个问题很重要,因为欠薪会议已经结束。您能提供更多关于您提供的第二种解决方案的信息吗? – user93796 2009-04-23 14:12:55

0

通常,问题在于对象的某个属性被延迟加载。有一两件事你可以做的是有它在您的查询预加载:

距离Sale销售 其中sale.date>:的startDate LEFT JOIN取sale.product

这将预取的销售。产品对象。

这个网站有更多的信息:http://www.javalobby.org/articles/hibernate-query-101/

-Dave

0

有许多方法来预取特性,所以它们的存在后,会话关闭:

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

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