0

私は疑問に思っています:FetchType.LAZYDAOパターンを使用する1対多のポイントは何ですか?基本的にダメ?DAOの外に出るとすぐに(たとえば、実際の作業が行われた場合)、休止状態のセッションに参加していないため、関連データをフェッチできなくなります。

例を見てみましょう:

StudentおよびClass。学生は多くのクラスを受講します。彼はシステムにログインし、Studentエンティティオブジェクトがシステムから取得されます。

application layer -> Service Layer -> DAO

LazyInitializationException今、学生は、私たちがDAOの外にいるときに、どのクラスを受講しておっと、発生するかを確認したいと考えています。

これを防ぐためのオプションは何ですか?私はグーグルアワーが好きで、そもそも怠惰な目的を打ち負かすDAOを離れる前に実際にすべてをフェッチすることを除いて、これに対する解決策を見つけられませんでした。(読んだことOpenSessionViewFilterがありますが、これはアプリケーション層とは独立して機能するはずです)

この問題をどのようにうまく解決しますか?これに悩まされない代替パターンは何ですか?

編集:

LazyInitializationException次の設定では何も得られません。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound", 
        cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.JOIN)

面白いのは、まさにこのようになっているに違いないということです。

削除@Fetch->LazyInitializationException

さらに見知らぬ人は、私が削除するorphanRemoval = trueと、 。LazyInitializationExceptionでも発生し@Fetchます。したがって、両方が必要です。

たぶん誰かが私にこれが事実である理由を教えてくれるかもしれません。現在、純粋なJDBCの場合と同様に、休止状態を完全に破棄する傾向があります。数時間前に目的の動作に到達したはずです...

4

2 に答える 2

1

同じセッションがなくても、いつでも外部キー関係データをフェッチできます。セッションはアプリケーション層の外部に存在しないため、データを取得して設定する方法で手動で取得するだけです。

アプリケーション層:

public List<SchoolClass> getSchoolClassesByStudent(Serializable identifier)
{
    List<SchoolClasses> schoolClasses = // get classes by student using criteria or hql
    return schoolClasses;
}

クライアントレイヤー:

public void loadSchoolClassesByStudent(Student student)
{
    student.setSchoolClasses(application.getSchoolClassesByStudent(student.getId()));
}

私自身、休止状態のエンティティのコレクションをサポートしないことを選択しました。
サーバーがクライアントに提供する、これと同様の非常に一般的なメソッドを使用して、すべての子リレーションをフェッチします。

編集:または、データにアクセスする前にデータが初期化されていないかどうかをDAOの外部でチェックし、汎用メソッドを使用して初期化できるロジック(インターセプター?)を作成します。
これは、Hibernate jarがクライアントレベルにあることも前提としています。これは、これが適切かどうかによって異なります(初期化されていないデータがnullに設定されていない場合も同様です)。

于 2012-10-08T11:12:14.417 に答える
0

この問題を解決する1つの方法は、OpenSessionInViewFilterフィルターを使用することです。

<filter>
    <filter-name>hibernateSessionFilter</filter-name>
    <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
</filter>
于 2012-10-08T11:12:30.360 に答える