2

このアプリケーションは、次の3つの部分で構成されてい
ます。1。モデルクラスとDAOクラス、およびスプリング構成を含むコアモジュール。
2.コアパッケージを使用し、(ポータル)Web環境で実行されるWebモジュール。
3.タスクモジュール。これもコアパッケージを使用し、スケジュールされたタスクとして実行されます(Webコンテキストなし)。

Webモジュール用のSpringFilterを使用してOpenEntityManagerInViewパターンを導入しようとしています。私が理解している限り、DAOはEntityManagerを閉じてはなりません。これは、フィルターがそれを行うためです。EntityManagerさらに、 with@PersistenceContextの代わりにEntityManagerFactorywithを挿入し@PersistenceUnitます(そうですか?)。

しかし、タスクモジュールでこれらの変更を加えた同じコアパッケージを再利用するにはどうすればよいですか?EntityManagerのライフサイクルを制御するフィルターはありません。

4

1 に答える 1

2

OpenEntityManagerInViewFilter通常、次のように、 Springトランザクション管理を補完するために使用されます。

  • コードでトランザクション境界を定義します。EntityManagerトランザクション内では、 injected with @PersistenceContext(またはから取得したHibernateセッション)を使用できますgetCurrentSession()。また、トランザクションはJPA作業単位を定義します。つまり、トランザクション内で行った永続オブジェクトへのすべての変更は、データベースに自動的にプロページされます。

  • ただし、定義されたトランザクションの外部でデータベースにアクセスする必要がある場合があります(最も注目すべきケースは、ビューをレンダリングするときの遅延読み込みです)。この場合OpenEntityManagerInViewFilter、データベースにアクセスして、@PersistenceContextHTTPリクエスト処理中の任意の時点で使用できるようになります。

ご覧のとおりOpenEntityManagerInViewFilter、不在のトランザクションの代わりとして機能するため、OpenEntityManagerInViewFilterトランザクションのスコープ内で実行しなくても同じコードを実行できます。したがって、トランザクションモジュールを適切に定義して、タスクモジュール内のすべての永続性関連のコードがトランザクション内で実行されるようにする必要があります。

于 2012-09-19T10:12:43.700 に答える