質問
開発中のアプリがあり、2つの異なるJPA実装のサポートを検討しています。
現時点ではopenjpaを使用しており、十分にテストされたコードがあります。
トップリンクを交換し、テストを実行したところ、多数の失敗が見つかりました。
JPAは標準であるため、違いはないはずです!
2つのJPA実装をサポートする理由は、複数のアプリサーバーで実行できるようにするためです。
つまり、第一に、実装とサーバーの間に1対1のマッピングがあるというのは本当ですか。つまり、たとえばWASでtoplinkを使用したり、Glassfishでopenjpaを使用したりできますか?
さまざまな障害をさらに調査する前の2番目の質問は、JPA仕様であり、2つの実装のサポートを非実用的にするほど広範ですか?両方でコードを動作させようとする必要がありますか?
解決
TopLink Essentialsを使用していて、EclipseLinkに移行したときにも同じことに気付きました。 EclipseLinkは同じコードベースに基づいていますが、コードは多くの場所で破損しています!
ほとんどのケースは、TopLink EssentialsがJPA仕様に完全に準拠していないという事実によるものであることがわかりました(たとえば、ネイティブクエリはベクターのリストなどを返します)。 EclipseLinkとHibernateの間の移植性は優れていると思いますが、おそらく完璧ではありません。
ある時点で、おそらくキャッシュなどのベンダー固有の拡張機能を使用したいと思うでしょう。このため、JPAプロバイダーを選択し、JPA仕様で指定されている機能のみを最初に使用することをお勧めします。しばらくしてまだ特定のプロバイダーに満足している場合は、そのプロバイダーに固執し、ベンダー固有の機能を利用し始めます。
アプリケーションサーバーの選択によってJPAオプションが制限されるとは思わないか、その逆もありません。少なくとも、制限はありません。
他のヒント
いいえ、それは真実ではありません-アプリケーションサーバーはJPA実装を強制しないので、さまざまなアプリケーションサーバーでOpenJPAを使用できるはずです。 Hibernateをどこでも使用できるように、他のJPA実装を使用できます。はい、正しく動作する前にjarの競合とトラブルシューティングを行う必要があるかもしれません...
いいえ、2つ以上のJPA実装でコードを機能させることは実用的ではありません。しかし、具体的な必要性のないこの演習の目的はかなり非現実的です。一般に、要件を最も満たすJPA実装を選択する方が適切です...しかし、繰り返しますが、異なるJPA実装を交換可能に使用することが必要になる場合があります:顧客の要件、ライセンスの制約、異なるデータベースのサポート、異なるプラットフォームサポート(モバイル、組み込みなど)。
通常、JPA実装は仕様のスーパーセットです。ベンダー固有の機能への依存を最小限に抑えるよう注意している場合、アプリケーションは移植可能である必要があります。
しかし、実際には実装間に微妙な違いがあり、アプリケーションを真にクロスJPAにすることが難しくなります。
私の意見では、最小限の変更で他のJPA実装への移植が可能になるように、可能な限り標準に準拠することが最善です。特定のコンテキストで特定の企業向けにアプリケーションを開発している場合、複数のJPA実装に対してテストすることはあまり意味がありません。その逆も同様です。