1

lazy="extra"Java の休止状態でのフェッチに問題があります。

親と子の2つのクラスを作成しました。親クラスでは、次のフィールドを定義しました。

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. 遅延読み込みによるデータへのアクセス (p. ex.parent.getChildren())

ステップ 4. でこのエラーが発生します。これは、Hibernate が遅延読み込みでデータを読み込もうとするためです。セッションを既に閉じているため、これは不可能です。

コードを確認してください。いつセッションを閉じますか。

この問題を解決するための解決策は、セッションを閉じないか、セッションを閉じる前に遅延データにアクセスすることです (その時点では必要ない場合でも)。

于 2012-06-04T07:01:20.567 に答える