私は疑問に思っています:FetchType.LAZY
DAOパターンを使用する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の場合と同様に、休止状態を完全に破棄する傾向があります。数時間前に目的の動作に到達したはずです...