System.out.println()vs Hibernate.initialize(proxy)

时间:2014-10-14 05:00:53

标签: java hibernate

我们如何正确解决此错误?

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

我很难理解并解决此异常。在我的应用程序中,我需要检索映射到多个表的对象列表。我试着

for(SampleItem item : list) {
   // Hibernate.initialize(every item's field)
}

但是继续得到上述错误。我可以像代码一样简单地解决这个问题:

System.out.println(list)

所以我想知道哪种方法更好(优点和缺点)来解决这个异常。我个人认为Hibernate.initialize()会是更好的选择;但不确定为什么(因为hibernate可能会引入这个函数)?

2 个答案:

答案 0 :(得分:2)

假设您使用hibernate从数据库中检索了一个名为Movie的实体,并且该实体具有Actor个具有属性actors的实体的集合,那么默认情况下hibernate会加载{{1}的集合懒惰的实体。这意味着Actor实体的集合属性Movie被赋予了代理对象。

现在,当您在关闭hibernate会话后尝试访问此代理属性actors的元素时,您将获得actors

要解决此问题,您将有2个选项。

  1. 正如Utpal在他的回答中所提到的,你可以为集合属性设置提取策略为LazyInitializationException

  2. 调用Hibernate.initialize()并传递collection属性,告诉hibernate初始化集合元素。必须在关闭会话之前完成此操作。

答案 1 :(得分:0)

fetch=FetchType.EAGER

尝试使用已映射POJO的地方。