我想在我的持久层管理事务, 但是当我尝试懒洋洋地获取结果我得到这个错误:冬眠懒动初始化问题
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
我可以使用LockMode或任何其他方式来解决这个问题? 没有任何交易可以通过它的id找到一个对象?
我想在我的持久层管理事务, 但是当我尝试懒洋洋地获取结果我得到这个错误:冬眠懒动初始化问题
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
我可以使用LockMode或任何其他方式来解决这个问题? 没有任何交易可以通过它的id找到一个对象?
您的问题是,当您尝试访问内容时,Hibernate会话已经关闭。没有会话,Hibernate无法加载内容。通常有两种方法可以缓解此问题:
在完成该页面之前,请勿关闭会话。这种模式被称为“会话中的视图”,例如可以使用servlet过滤器来实现。
在关闭会话之前初始化您需要的所有内容。如果你想初始化整个对象,你可以使用Hibernate.initialize(object)。
编辑:你不能在Hibernate的事务之外做任何事情。
通常,问题在于对象的某个属性被延迟加载。有一两件事你可以做的是有它在您的查询预加载:
距离Sale销售 其中sale.date>:的startDate LEFT JOIN取sale.product
这将预取的销售。产品对象。
这个网站有更多的信息:http://www.javalobby.org/articles/hibernate-query-101/。
-Dave
你也可以看看从休眠官方的解决办法,在 http://www.hibernate.org/43.html
有许多方法来预取特性,所以它们的存在后,会话关闭:
@OneToMany(fetch = FetchType.EAGER)
的JPA中的bean描述符中使用适当的属性,但有类似的休眠方式。FETCH INTO
关键字。或者只是使用另一个ORM ......像Ebean ORM其中懒加载只是工作:)
谢谢。我知道这个问题很重要,因为欠薪会议已经结束。您能提供更多关于您提供的第二种解决方案的信息吗? – user93796 2009-04-23 14:12:55