0

私たちは、(できれば) 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に設定されています。

ヒントをお寄せいただきありがとうございます。

4

2 に答える 2

0

Hibernate チームは、Hibernate が OSGi でよりスムーズに動作するようにいくつかの改善を行ったので、最新の Hibernate バージョンの使用を検討するかもしれませんが、それが既にリリースされているかどうかはわかりません。

于 2013-05-29T06:51:57.933 に答える
0

OSGI との統合を容易にするために、EclipseLink を使用することをお勧めします。

OSGIでJPAを使用したことがあります。私は OpenJPA から始め、問題が発生した後に Hibernate に切り替え、最終的に EclipseLink を使用して他の問題を解決しました。

それが役に立てば幸い

于 2013-06-01T08:28:14.877 に答える