私のトピックについてすでにかなりの数の質問があることは知っていますが、どの回答にも完全に満足しているわけではありません。ウェブ上でまともな情報を見つけるのも難しいので、私は新しい質問を始めています。
基本的に、次の要件に準拠する必要があるシナリオで、Spring アプリケーションで JPA を最適に使用する方法に苦労しています。
- Spring トランザクション管理の使用
- 複数の永続ユニットの使用 (Spring Data Repository のサポートあり)
- 複数の DataSource を使用する (PersistenceUnit の DataSource を実行時に動的に切り替えられるようにしたい)
- アプリケーションの一部 (JPA エンティティを含む) を個別のモジュールに結合して、それらを異なるプロジェクトで使用する
次のユースケースを検討してください
- アプリケーション A は、ユーザーが異なるデータソース D1、D2、Dn から DB データを読み書きできるようにします。必要なエンティティを定義するために必要な PersistenceUnit P1 は 1 つだけです
- モジュール M には、ユーザーと権限の情報を格納するために使用される AuthUser と AuthRole の 2 つのエンティティが含まれています。さまざまなプロジェクトでモジュール化して使用したいと思います。基本的に、アプリケーションがアクセスする他のデータソース D1、D2 から独立して、ユーザーが 1 つのデータベースに格納されるため、2 つのエンティティとデータソース Da のみを含む PersistenceUnit P2 を定義できる必要があります。
- アプリケーション A にはモジュール M が含まれ、使用するデータソースを定義します
私が遭遇した問題:
- モジュール M で @PersistenceContext と @Transactional を使用したいと思います。どこでも明示的な persistenceUnits または transactionManagers を指定する必要はありません。理想的には、Spring は実行中のトランザクションの PersistenceContext / EntityManager を使用します。このようにして、アプリケーション A のトランザクション メソッドで目的の PersistenceUnit を指定し、モジュール M がトランザクションと PersistenceContext を継承します。これを行う方法の解決策が見つかりませんでした。カスタムの PersistenceAnnotationBeanPostProcessor を提供することを考えていましたが、この件に関する Web 上のリソースを見つけることができませんでした。
- 同じ PersistenceUnit で複数の DataSource を使用するために、AbstractRoutingDatatSource を調べました。これは、Transactional アノテーションとどのように連携するかについては疑いがありますが、機能するはずです。それを使用した経験と、トランザクションの途中でデータソースが変更されないようにする方法についての経験はありますか?
私の主張を明確にすることができれば幸いです。最初の例のように、あまり多くのコードを含めたくありませんでした。技術的な答えよりも概念的な答えに興味があります。1 つの (長い) 文に要約するには:
ソースコード (特にモジュール) でハードコーディングされた永続性情報 (persistenceUnit 名など) を指定する必要なく、複数の PersistenceUnits と DataSources を使用してモジュール式のトランザクションアプリケーションを構築するための Spring / JPA のベストプラクティスは何ですか?