我想在我的持久层中管理一个事务, 但是当我试图懒洋洋地获取结果时,我得到了这个错误:
org.hibernate.LazyInitializationException:懒得初始化角色集合
我可以使用LockMode或其他任何方式解决此问题吗? 可以通过ID找到一个没有任何事务的对象吗?
答案 0 :(得分:2)
您的问题是,当您尝试访问内容时,Hibernate会话已经关闭。没有会话,Hibernate无法加载内容。通常有两种方法可以缓解此问题:
在完成页面之前,请勿关闭会话。此模式称为“视图中的会话”,例如可以使用servlet过滤器实现。
在关闭会话之前初始化您需要的所有内容。如果要初始化整个对象,可以使用Hibernate.initialize(object)。
编辑:你不能在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)
预取属性的方法有很多种,所以在会话结束后它们就在那里:
@OneToMany(fetch = FetchType.EAGER)
的JPA中的bean描述符中使用适当的属性,但有类似的hibernate方法。 FETCH INTO
关键字。 答案 4 :(得分:0)
或者只是使用另一个ORM ...就像Ebean ORM,其中延迟加载正常工作:)