Hibernate EntityManager(vs. Hibernate Core)を使用することの欠点はありますか?
質問
Hibernate EntityManagerドキュメント 状態, 、 それ:
プロジェクトのビジネスと技術的ニーズに応じて、3つすべての組み合わせ、JPAプログラミングインターフェイスとライフサイクルなしの注釈、または純粋なネイティブの冬眠コアを使用することもできます。常に冬眠ネイティブAPIに戻るか、必要に応じてネイティブJDBCおよびSQLにさえ戻ることができます。
JPA API(EntityManager)を使用するコードは、明らかにポータブルです(Hibernate Coreに時折フォールバックがある場合でも)。
しかし、純粋に冬眠コアを使用する場合、何か利点がありますか? JPA 2モデルが矛盾なしに冬眠コアの上に本当に適合しているのだろうか? IOW、コアへのフォールバックは常に簡単で問題なく?
私の主な関心事はこれです:
たぶん、違いはAPIだけでなく、根底にあることにもあります セマンティクス?! (例:競合する可能性のあるさまざまなトランザクション/バージョン化/ロックセマンティクス:悲観的なロックはコアドキュメントで言及されていますが、エンティティマネージャーのドキュメントでは言及されていません。 。)
解決
しかし、純粋に冬眠コアを使用する場合、何か利点がありますか?
JPA 2.0が必要なものをサポートしている場合、私の意見では、Hibernate Coreを直接使用することで利点はありません(そしてJPA 2.0を使用すると、ギャップはより薄くなり、ルールではなく、例外をコアする必要があります。良いこと)。
JPA 2モデルが矛盾なしに冬眠コアの上に本当に適合しているのだろうか?
JPA 1.0以来、Hibernate開発者は「JPAを念頭に置いて」を備えたHibernate3を作成し、Hibernate3でJPAセマンティクス、デフォルトなどを採用しました。これでギャビンを聞きたいと思うかもしれません Tech Talk:Hibernate3とEJB3のGavin King:
このテクノロジートークでは、キングは議論します hibernate3がEJB3の上に構築および拡張する方法, 、次のようなトピックに対処する:
- hibernate3の新機能3
- JbossのHibernate3とEJB3コンテナの関係
- Hibernate3をEJB3仕様と区別するもの
- Hibernateのカスタム注釈は、EJB以外で入手できます
- 冬眠の未来
そして、私の実践的な経験によれば、HibernateがEJB 3と矛盾しないという事実は真実です。
IOW、コアへのフォールバックは常に簡単で問題なく?
Coreを直接使用するかどうかにかかわらず、あなた それは それを使用する( EntityManager
周りのラッパーです Session
)。したがって、はい、コアに戻るのは簡単です(たとえば、たとえば、クエリのような仕様のようなスペックにまだ含まれていないものの場合)。そして、いいえ、これは問題を引き起こしません(JPAで実際に使用している、またはそのサブセットを使用しているため)。
関連する質問
他のヒント
それは明らかでした: プロジェクトのビジネスニーズと技術的ニーズに応じて
しかし、純粋に冬眠コアを使用する場合、何か利点がありますか?
Hibernate AnnotationsとHibernate EntityManagerの両方がHibernate Coreの上に構築されていることを忘れないでください。 だからもう1つのレイヤー. 。それに加えて、XMLファイルに保存されているマッピングメタデータに依存しています。一部のユーザーは、選択したDAOの実装とは完全に独立しているドメインオブジェクトを残すため、注釈の代わりにXMLファイルを使用することを好みます。しかし、注釈を使用する場合、JPAブックで冬眠は明確です
ネイティブのXMLファイルと比較して、メタデータをマッピングするためのコードの行を削減すると、注釈のより良いリファクタリング機能が好きかもしれません
JDBC >> Hibernate core >> Hibernate Annotations
...
JDBC >> Hibernate core >> Hibernate EntityManager
JPA 2は、JPA 1が提供されていないものに適しています。現在、多くの新機能が利用可能になりました
- オブジェクト指向クエリAPI
- ラッパーの@embeddable
- @embeddables @elementCollectionのコレクション
等々...
JPA EntityManagerで使用することで、基礎となるベンダー固有のプロバイダーを取得できることを忘れないでください getDelegate 方法JPAが提供しない機能が必要な場合。
冬眠コアを直接使用するのが好きです。 XMLマッピングファイルもお好みです。
冬眠コア機能にアクセスするために、二次層を使用することにあまり興味がありません。私が持続性層の携帯性を懸念している限り、 完全な問題ではありません.
Hibernate APIよりもJPA APIの実際の利点はほとんどありません。JPAという名前のクエリを使用している人(基準はおそらくより明確かつより良くなるでしょう)を使用しており、JPAアノテーションの設計がやや設計されています。
それ以外は、JPAは単なるレイヤーであり、複雑さと潜在的なオーバーヘッドを追加します。このような状況では、正しい決定はそれを使用することです。
データベースの移植性OTOHは非常にリアルです。私は完全にポータブルで、誤った設計された冬眠であるクレイジーな混乱よりもはるかにパフォーマンスとシンプルなカスタムアロケーター(ジェネレーター)を使用しています。
このアプローチは、複数の主要な商業、政府、レガシーデータベースのリエンジニアリングプロジェクトで非常に成功しています。要するに、重要なことに焦点を合わせてください - そして、APIの上にAPIはそれではありません。
JPA APIを使用することの利点は、純粋な冬眠を使用することの欠点をはるかに上回ります。私は専門家ではありませんが、冬眠に立ち寄ることが有益な状況に気づいていません。 (純粋なJDBCを行うためにドロップダウンすることは別の問題です。)
誰かが共有する例があるなら、私はそれらを見たいと思っています。