lazy =“extra”fetch in hibernate java不起作用

时间:2012-06-03 12:37:04

标签: java hibernate

我在java中使用hibernate中的lazy="extra" fetch有问题。

我创建了两个类,父类和子类。在父类中,我定义了以下字段:

public class Parent{ 

...

@OneToMany( cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="parent")

@IndexColumn(name="index", base=1)

**@LazyCollection(LazyCollectionOption.EXTRA)**

   private List<Child> children = new ArrayList<Child>();

   public List<Child> getChildren() {
    return children;
   }

   public void setChildren(List<Child> children) {
    this.children = children;
   } 

...

}

分别在Child类中我有这个父字段定义

public class Child{
...

@ManyToOne( fetch = FetchType.LAZY,  optional = true)

 @JoinColumn(name = "parent_ID", nullable = true)

private Parent parent;

 public Parent getParent() {
    return parent;
   }

public void setParent(Parent parent) {
    this.parent = parent;
   }

...

}

但是当我在我的实用程序类中调用parent.getChildren()。size()时出现错误

未能懒惰地初始化角色集合:com.realcommerce.formsGenerator.entity.Parent.children,没有关闭会话或会话

有人可以帮助我理解我做错了什么,以及为什么我的代码无效

1 个答案:

答案 0 :(得分:0)

如果您执行以下操作,通常会发生此错误:

  1. 公开会议
  2. 选择父数据
  3. close session
  4. 使用延迟加载访问数据(例如,parent.getChildren())
  5. 在第4步中,您收到此错误,因为Hibernate尝试使用延迟加载来加载数据,这是不可能的,因为您已经关闭了会话。

    检查您的代码:何时关闭会话。

    解决此问题的解决方案是在关闭会话之前不关闭会话或访问延迟数据,即使在那一刻不需要也是如此。