私たちは、(できれば) Apache Karaf にデプロイされるモジュールのスイートを開発しています。各モジュールには、ドメイン JPA エンティティー/DAO、サービス、Web コンポーネントなどから始まるレイヤー構造があり、これらのレイヤーのそれぞれが異なる OSGi バンドルに変わります。
JPA エンティティは、共通のバンドルに属するいくつかの抽象スーパータイプを拡張します。そしてここで問題が発生..
OpenJPA は、Karaf と OSGi の方法を学ぶときに多く「宣伝」されるので、最初に試してみました。コンパイル時の拡張は、複数のバンドル (jar) にまたがるエンティティ階層 (複数の PU と抽象スーパータイプ) のため、大惨事であり、完全に時間の無駄でした。うまくいったとしても、残念ながら OpenJPA の拡張では、すべてのモジュールを同じ Java および OpenJPA バージョンでコンパイルする必要があり、将来、各モジュールが異なる速度で開発されて醜くなる可能性があります。
次に、Hibernate を調べて、いくつかのチュートリアルのおかげで動作するようにしました (あまり人気がないようです)。ただし、すべての永続ユニットは transaction-type="JTA" ですが、データソースは JNDI 経由の JTA タイプであり、DAO CRUD メソッドはブループリントのようにマークされています。たとえば、DAO save メソッドは次のようなもののみを保持する必要があります
entityManager。永続化(アカウント)
が続く場合にのみ機能します
entityManager。フラッシュ();
トランザクションの最後に変更が自動的にフラッシュされることを期待していました (つまり、save メソッドの最後 - 現在のトランザクションの終了境界)。
永続化の直後に flush() を追加して実行時例外をスローすると、save メソッド全体のロールバックはありません。
ログにエラーはなく、デバッグ レベルでチェックすると表示されます
Created a new persistence context org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d for transaction [Xid:globalId=ffffffca2d6dffffff...
...
自動結合チェックのため JTA 同期登録をスキップしてい
ます ...
EntityManager org をクリアしています.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d トランザクションが完了したため。
トランザクションはありますが、変更がデータベースにプッシュされずに終了します..
ちなみに、フラッシュモードはAUTOに設定されています。
ヒントをお寄せいただきありがとうございます。