1 に答える
lazy="false"
クラス要素で使用する代わりに、コレクションで使用することをお勧めします。つまり、たとえば、User
オブジェクトをフェッチするたびに、toUserSpaceRole
のコレクションが遅延なしとしてマークされているため、コレクションもフェッチされます。
lazy="false"
class要素で使用すると、望ましくない結果が発生します。通常、コレクションが上記のように遅延していない場合、コレクション全体は、フェッチ戦略に応じて、join、select、またはsubselectのいずれかを使用してフェッチされます。たとえば、selectストラテジーではUser
、dbからaをフェッチすると、hibernateは2つのselectステートメントを発行します。1つはユーザー自体用で、もう1つはコレクション用です。ただし、休止状態は、コレクション内の個々の要素をプロキシすることを選択できます。
を使用lazy="false"
すると、hibernateはこれらのオブジェクトをプロキシできず、通常、2つのテーブル間の結合で単一のクエリを使用することになります。それは必ずしも望ましいとは限りません。
ただし、正しいアプローチは、アーキテクチャを調べて、最初に例外が発生した理由を理解することです。すでにセッションを閉じた後、デタッチされたオブジェクト(ここを参照)からプロパティまたはコレクションにアクセスしようとしました。サービスレイヤーを見て、セッションを閉じてオブジェクトを呼び出し元に渡す前に、必要なすべてのデータをフェッチする方法を確認します。