私は、Hibernateデータアクセスレイヤーがインメモリオブジェクトキャッシュの背後に座っています。クライアントサイドのキャッシュミスの場合、インメモリキャッシュは、オブジェクトグラフをキャッシュにロードするためにHibernateレイヤーを呼び出します。オブジェクトがキャッシュにどのようにシリアライズされるかによって、Hibernateからオブジェクトグラフ全体を一度にロードする必要があります(つまりレイジーロードはありません)。このようなシナリオは、Hibernateのドキュメントhereでカバーされています。ここでの抜粋です。Hibernate.initialize()がレイジーロードされたコレクションで動作しないようです
個別のビジネス層を備えたアプリケーションでは、ビジネスロジックはWeb層が戻る前に、必要なすべてのコレクション「準備」しなければなりません。つまり、ビジネス層はすべてのデータをロードして、特定のユースケースに必要なプレゼンテーション/ Web層に既に初期化されているすべてのデータを返す必要があります。通常、アプリケーションは、Web層に必要な各コレクション(この呼び出しは、セッションが閉じられる前に行わなければなりません)に対してHibernate.initialize()を呼び出すか、FETCH句またはFetchMode.JOINを使用してHibernateクエリを使用して賢くコレクションを取得します基準で。これは、セッションファサードの代わりにコマンドパターンを採用する方が簡単です。
私はちょうど私が私がちょうどデフォルトレイジーローディング動作を維持し、その後に各コレクションにHibernate.initialize()
を行うと考えました(this StackOverflowの質問に記載されているように、私はMultipleBagFetchExceptionで終わる)、直接私のエンティティにフェッチイーガーを有効にすることはできませんので、その物体を完全に飽和させるようにする。問題は、私のコレクションがまだ空になることです。
私のユニットテストでは、この戦略はうまく機能しているようです(私のオブジェクトは適切に飽和しています)が、このHibernateレイヤーをインメモリキャッシュにプラグインとして実行すると私のDALはメモリ内のキャッシュがキャッシュミスのために呼び出すことになります)私は説明された動作を見ています。
現在、私は
<property name="current_session_context_class">thread</property>
と私のセッションを処理し、その後、私は、負荷へのオブジェクトのための私のセッションの取得を行うた後、私のDAOで
sessionFactory.getCurrentSession();
を呼んでいます。私のセッション処理は、私の作業ユニットテストと非動作DAOの両方で同じことが分かります。ここで何が起こっているかについての提案。さらに詳しい情報が必要なら私に知らせてください。