3

休止状態プログラムの奇妙な状態を見つけました。これが私のコードです

public Set<AnotherClass> getAnotherClassSetsFromSomeClass() {
        Session session = HIbernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        SomeClass sc = (SomeClass)session.get(SomeClass.class,"classId");
        trans.commit();
        session.close;
        return sc.getAnotherClassSet();
    }

Javaコンソールで実行すると、このコードはうまく見えます。

1 つの Web アプリ (JSF) を使用している場合、このエラーが発生しました

遅延初期化に失敗しました - セッションがないか、セッションが閉じられました

1 対多の関係があります (1 つの SomeClass には複数の AnotherClass があります)

sc.getAnotherClassSet()null ポインターとして返されることを示す例外メッセージ。データベースにそのデータがあると確信しています。

System.out.println(sc.getAnotherClassSet())berforeを追加するとreturn sc.getAnotherClassSet()、コードが正常に動作することがわかりました。

何が起こったのですか?ありがとう。

4

2 に答える 2

5

おそらく、あなたの関連付けは(おそらくデフォルトで)に@OneToManyマッピングされています。これは、あなたの場合、エンティティをロードするときにfetchType="lazy"関連付けがロードされないことを意味します。を使用してアクセスしようとしたときにのみロードされます。AnotherClassSetSomeClassgetAnotherClassSet()

ただし、あなたの例では、セッションが閉じられた後、このメソッド ( getAnotherClassSet()) がステートメントで呼び出されます。return

この問題を解決するには、関連付けgetAnotherClassSet()をロードするためだけに、セッションを閉じる前に呼び出しを試みることができますAnotherClassSet

于 2013-08-07T11:59:13.080 に答える
1

なぜなら、あなたが使用しているからですlazy initialization(これはデフォルト設定です)。ではlazy initialization、すべてのコレクション フィールドは要求があった場合にのみ取得されます。eagerコードを機能させるには、初期化を として指定する必要があります。Eager initialization1 回のフェッチでオブジェクト全体をフェッチします。

于 2013-08-07T11:43:41.977 に答える