1

lazy="extra"在java中的hibernate中获取问题。

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

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;
   } 

...

}

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

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,没有会话或会话已关闭

有人可以帮助我理解我做错了什么,以及为什么我的代码不起作用

4

1 回答 1

0

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

  1. 公开课
  2. 选择父数据
  3. 关闭会话
  4. 使用延迟加载访问数据(例如 parent.getChildren())

在第 4 步中,您会收到此错误,因为 Hibernate 尝试使用延迟加载来加载数据,这是不可能的,因为您已经关闭了会话。

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

解决此问题的解决方案要么不关闭会话,要么在关闭会话之前访问惰性数据,即使当时不需要。

于 2012-06-04T07:01:20.567 回答