Hibernate vs JPA vs JDO-それぞれの長所と短所?[閉まっている]


174

私はORMをコンセプトとして使い慣れており、数年前に.NETプロジェクトでnHibernateを使用したことさえあります。ただし、JavaでのORMのトピックに追いついておらず、これらのツールを使用する機会もありませんでした。

しかし、今では、一連のレガシーWebサービスから離れようとして、アプリケーションの1つにいくつかのORMツールを使い始める機会があるかもしれません。

JPA仕様、Hibernateライブラリ自体で得られるもの、JDOが提供するものの違いを説明するのに苦労しています。

だから、私はこの質問が少々自由回答であることを理解していますが、私はいくつかの意見を得ることを望んでいました:

  • それぞれの長所と短所は何ですか?
  • 新しいプロジェクトにはどれを提案しますか?
  • 一方のフレームワークと他方のフレームワークを使用することが理にかなっている特定の条件はありますか?

回答:


112

いくつかのメモ:

  • JDOとJPAはどちらも仕様であり、実装ではありません。
  • コードが標準のJPAのみを使用するように制限すれば、JPA実装を交換できるという考え方です。(JDOの同上。)
  • Hibernateは、JPAのそのような実装の1つとして使用できます。
  • ただし、Hibernateは、JPAの機能以上の機能を備えたネイティブAPIを提供します。

IMO、私は休止状態をお勧めします。


Hibernate固有の機能を使用する必要がある場合の対処法について、いくつかのコメント/質問がありました。これを見るには多くの方法がありますが、私のアドバイスは次のとおりです。

  • ベンダーとの連携の可能性に不安がない場合は、Hibernateと、意思決定におけるさまざまなベンダー固有の拡張機能を含む他のJPAおよびJDO実装の間で選択を行ってください。

  • ベンダーとの連携の可能性に不安があり、ベンダー固有の拡張機能に頼らずにJPAを使用できない場合は、JPAを使用しないでください。(JDOの同上)。

実際には、ベンダーとの連携で心配されると、ベンダー固有の拡張機能が必要なとをトレードオフする必要があるでしょう。

また、他の要因もあります。たとえば、あなた/スタッフがそれぞれのテクノロジーをどの程度理解しているか、製品のライセンスにかかるコスト、JDOとJPAの将来について何が起こるかについて、誰の話を信じているかなどです。


8
ツールキット、素敵で短い。言及する価値のあるもう1つの点は、JPAは必要に応じて実装固有の機能の使用を妨げないことです。つまり、JPAでは、Hibernateが実装されている場合は、任意のHibernate機能を使用できます。
topchef 2010年

1
Hibernateの特定の機能が必要な場合、JPAを使用する利点は何ですか?
ブルーノレイ

22
追加すべき重要な注意事項:JPAとJDOはどちらもRDBMSに対して優れたサポートを提供しますが、JDOは「データストア」にとらわれないため、RDBMSの世界に限定されません。現時点でNoSQLの地盤が高まっているため、アプリを従来の* SQLの世界にロックすることを回避する永続化標準の使用を検討するのが賢明でしょう。JDOアプリケーションは、非RDBMSデータストアに簡単にデプロイできます。サポートされているデータストアの完全なリストは、datanucleus.org
accessplatform

2
@ゴルフマンは何起こるかを考慮して選択するのですか?最終的にNoSQLのサポートが必要になった場合でも、後で何かを巻き込むのを止めるものは何もありません... KISS
TM。

1
@Bruno-HibernateのHibernate固有ではない部分を使用している場合、JPAを使用しています。もちろん、純粋なJPAに制限することの利点は、別のJPA実装に簡単に切り替えられることです。
Stephen C

69

JDOのDataNucleus実装を必ず評価してください。Hibernateは人気が高いように見えましたが、すぐにそれが100%透過的な永続化ソリューションではないことに気付きました。警告が多すぎて、ドキュメントには「このような状況の場合は、このようにコードを記述する必要があります」で一杯であり、自由にモデリングとコーディングの面白さを取り除きました。JDOがコードやモデルを調整して「適切に機能する」ようにすること決してありません。単純なPOJOを「メモリ内」でのみ使用するかのように設計してコーディングするだけで、透過的に永続化できます。

休止状態に対するJDO / DataNucleusのもう1つの利点は、ランタイムリフレクションのオーバーヘッドがすべてなく、ビルド時間のバイトコードの機能拡張を使用するため(大規模なプロジェクトのビルド時間に1秒を追加する可能性があるため)、メモリ効率が向上することです。 hibernateのランタイムリフレクションを利用したプロキシパターンよりも。

Hibernateでいらいらするかもしれないもう1つのことは、オブジェクトであると考えるものへの参照があるということです...それは多くの場合、オブジェクトの「プロキシ」です。バイトコード拡張の利点がない場合、プロキシパターンはオンデマンドロードを許可する必要があります(つまり、最上位のオブジェクトをプルするときにオブジェクトグラフ全体をプルしないようにします)。等しいとハッシュコードをオーバーライドする準備をしてください。参照していると思うオブジェクトは、多くの場合、そのオブジェクトの単なるプロキシです。

JDOでは得られない、Hibernateで得られる不満の例を次に示します。

http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53

「回避策」にコーディングしたい場合は、Hibernateが最適です。すべての時間をモデリング、設計、コーディングに費やし、醜い回避策に費やさない、クリーンで純粋なオブジェクト指向のモデル駆動型開発に感謝する場合は、JDO / DataNucleusの評価に数時間を費やします。投資された時間は千倍に返済されます。

2017年2月更新

かなり長い間、DataNucleusはJDO永続性標準に加えてJPA永続性標準を実装しているため、HibernateからDataNucleusへの既存のJPAプロジェクトの移植は非常に簡単で、コード変更をほとんど行わなくても、DataNucleusの上記の利点をすべて得ることができます。 、もしあれば。したがって、質問に関しては、特定の標準の選択、JPA(RDBMSのみ)対JDO(RDBMS + SQLなし+ ODBMSes +その他)、DataNucleusは両方をサポートし、HibernateはJPAのみに制限されます。

Hibernate DB更新のパフォーマンス

ORMを選択するときに考慮すべきもう1つの問題は、ダーティチェックメカニズムの効率です。これは、現在のトランザクションで変更されたオブジェクトを更新するためにSQLを構築する必要がある場合、特にオブジェクトが多い場合に非常に重要になります。このSOの回答には、Hibernateのダーティーチェックメカニズムの詳細な技術説明があります 。HIBERNATEを挿入したJPAは非常に遅い


3
そして、誰もが知っているように、JDOが非常に大規模に採用されている理由は、まさに拡張機能です。
Pascal Thivent、2010年

15
JDOに関連して初期の頃にHibernateの主要なプレイヤーによって実行されたよく知られているFUDと宇宙破壊は、不正で嫌なものにほかならず、間違いなくJDOの採用に何らかの影響を与えました。最近の開発者は、バイトコードの拡張はまったく問題ではないことを知っており、永続化以外のさまざまな目的で使用することがよくあります。新しいASMバイトコード拡張ライブラリーは非常に高速なので、完了する前に息をする時間すらありません。
Volksman '19 / 03/10

7
JDOの失敗は、開始時(javalobby.org/forums/thread.jspa?forumID=46&threadID=1326)からHibernateの前に予測されたため、Hibernateのせいにすることはできません。Hibernate / Toplinkは、SunとJDOプレーヤー(およびそれらのOODBMS)がマーケティングとFUDのためではなく、その時点でより良い回答であったために失敗したところ、成功しました。限目。ASMが今日非常に高速であるかどうかを気にする人は、5年以上前には必要でしたが、JDOが単に負けました。JDOは概念的に優れていますか?残念ながら、勝者の実装を予定どおりに進めることができませんでした(JPAが原因で戻ってくることはありません)。
Pascal Thivent 2010年

2
私の言葉を説明するには(開発中に人々が感じていた苦痛、またはなぜHibernateが勝利したのかを説明する別の投稿):mail-archive.com/open-jpa-dev@incubator.apache.org/…。リフレクション/ cglibが人々の問題に対する実用的な答えであったこと(そして、APIが概念的に優れていても、使用するのが面倒な場合は気にしないこと)は明らかであり、Hibernateの主要なプレーヤーはユーザーではなく、ユーザーのみです。それで、最後に、FUDを実際に広めているのは誰なのだろうと思います...
Pascal Thivent 2010年

7
まあ、これは確かに、少なくとも17の異なるHibernateプロFUD投稿があったはずの昔とは異なります(ただし、3つの異なるIPアドレスからのみ送信されます。数学の人々=)を実行してください)。
Volksman

54

私は最近、Javaプロジェクトの永続フレームワークを評価して選択しました。私の発見は次のとおりです。

私が見ているのは、JDOを支持するサポートは主に次のとおりであるということです。

  • 非SQLデータソース、db4o、hbase、ldap、bigtable、couchdb(cassandraのプラグイン)などを使用できます。
  • SQLから非SQLデータソースに、またはその逆に簡単に切り替えることができます。
  • プロキシオブジェクトがないため、hashcode()およびequals()の実装に関する苦痛が少ない
  • POJOが増えるため、必要な回避策が少なくなる
  • より多くの関係とフィールドタイプをサポート

JPAを支持するサポートは主に次のとおりです。

  • より人気のある
  • jdoは死んだ
  • バイトコード拡張を使用しない

JDO / Datanucleusを明らかに使用していないJPA開発者から、JDOを使用しないことについて弱い引数を提供している、JPAのプロ投稿がたくさんあります。

また、JDOに移行したJDOユーザーからの投稿もたくさんあり、結果として非常に満足しています。

JPAの人気が高いという点では、これは技術的に優れているというよりは、RDBMSベンダーのサポートが原因のようです。(VHS /ベータマックスのような音が私に)。

JDOとそのリファレンス実装Datanucleusは、GoogleによるGAEへの採用とソースコード(http://sourceforge.net/projects/datanucleus/)での積極的な開発によって示されているように、明らかに死んではいません。

私はバイトコードの拡張によるJDOに関する多くの不満を目にしましたが、なぜそれが悪いのかについての説明はまだありません。

実際、NoSQLソリューションにますます取り憑かれるようになった世界では、JDO(およびデータニュークリアスの実装)の方がはるかに安全な賭けのようです。

JDO / Datanucleusの使用を開始し、db4oとmysqlを簡単に切り替えられるように設定しました。迅速な開発にはdb4oを使用すると便利です。DBスキーマについてあまり心配する必要はありません。その後、スキーマが安定してデータベースにデプロイされたら、それは重要です。後で、アプリケーションのすべてまたは一部をGAEにデプロイしたり、分散ストレージを利用したり、あまりリファクタリングを行わなくても、hbase / hadoop / cassandraを活用したりできると確信しています。

Datanucleusの使用を開始する際の最初のハードルは少しトリッキーだと感じました-datanucleus Webサイトのドキュメントにアクセスするのは少し難しいです-チュートリアルは私が思ったほど簡単にはたどりません。そうは言っても、最初の学習曲線を過ぎると、APIとマッピングに関するより詳細なドキュメントは非常に役立ちます。

答えは、それはあなたが望むものに依存します。私はむしろ、よりクリーンなコード、ベンダーロックイン、ポジョ指向、nosqlのオプションより人気のあるオプションが欲しいです。

他の大多数の開発者/羊と同じようにやっているという温かいうるさい感覚が必要な場合は、JPA /休止状態を選択してください。自分の分野でリードしたい場合は、JDO / Datanucleusを試してみて、自分で考えてください。


9
実際、私が言ったように、私は解決策を選択しようとしているときに発見したことの印象を与えていました。はい、私はJavaの初心者ですが、なぜそれがその関連性があるのですか 一方、あなたは何度も投稿しましたが、JDOは死んでいるという事実を実証する証拠や証拠を提供せず、JDOが明らかに優れている技術領域を認めずに、JDOは死んでいるという意見を述べています。あなたは明らかにJDO / Datanucleusに対して何か個人的なものを持ち、これらのスレッドを、反JDOスタンスを永続させる手段として使用しています。
トム

4
パスカル-あなたはここの隅に自分自身を主張しています。よくある質問の広告セクションのポイントが足りないと思います。OPは2つの技術について意見を求めました。それは、どちらかの側を支持する人々を前進させ、彼らの建設的な批判/勧告を提示するように招いています。Andy / Datanucleusおよび他のJDOユーザーにとって、JDOの肯定的な点を強調し、批判から身を守ることは、休止状態を使用することを推奨している他の人よりも宣伝ではありません。
トム

5
このトピックに関するあなたの投稿が非難されたり、対立したり、失礼だったりする場合は、FAQの「Be Nice」というセクションを参照することをお勧めします。あなたの最初は強化についての皮肉なコメントでした。第二; 初期の実装の難しさを不満に思っており、もはや関係ありません。3番目は、RDBMSを使用しないことを好むかもしれない人たちへの子供っぽいあざけと侮辱でした。第四は、あなたとは異なる見方をする誰かの皮肉なあざけりでした。5番目は攻撃でした。オウムと呼んで。これは「いい」と思いますか?
トム

3
JDOでひどい経験をした場合は、何がひどかったかを説明し、それが以前のバージョンであったことと、その後改善された可能性があることを認めてください。また、他の人があなたに異なるニーズを持っているかもしれないことを認識する必要があります。JPAに「満足」していてRDBMSを使いたいからといって、他の人がそうであるとは限りません。多分あなたの評判を高めるためにあなたの急いで、あなたはその評判が授与するためにそこにあるものを見失っていましたか?ps。それは技術革新を駆動し、中ベンダーロックを軽減するものであるとして、開発者として、あなたは本当にこのようなプロジェクトの福祉に関心を持つべき。
トム・

6
これが私の最終的な回答になります:) .. 1.なぜそれを上げるのか疑問に思わないのなら?2.私はあなたの正直さを疑ったことはありません、あなたは他のポスターに親切ではなく、あなた自身と矛盾していると言いました。3. 8年以上の要約を提案した人はいませんが、不快になりそうな主観的なステートメントではなく、事実と例を使用してステートメントをバックアップしてください。5.この投稿の「hibernate / jpa / jboss is evil」の姿勢はどこにありますか?見えない。私はあなたの反JDOコメントだけを見ます。
トム

40

新しいプロジェクトにはどれを提案しますか?

どちらもお勧めしません!使用春のDAOのJdbcTemplateと一緒にStoredProcedureRowMapperそしてRowCallbackHandler代わりに。

私自身のHibernateの個人的な経験では、事前に節約された時間は、予期しないカスケード更新の動作などの問題を理解してデバッグしようとする無限の日によって相殺される以上のものです。

リレーショナルDBを使用している場合は、コードに近づくほど、制御が強化されます。SpringのDAOレイヤーを使用すると、ボイラープレートコードの必要性を排除しながら、マッピングレイヤーを細かく制御できます。また、Springのトランザクションレイヤーに統合されているため、コードに侵入することなく、複雑なトランザクション動作を(AOPを介して)非常に簡単に追加できます(もちろん、Hibernateでもこれを取得できます)。


4
これは明らかに、ODBC時代(90年代前半)(レガシーを読み取る)以降に蓄積された大規模なユーザーとコードベースによって駆動される、オブジェクトリレーショナルマッピング(ORM)の選択です。ORMフレームワークに進んで使用することを選択しない限り、JDBC(Springの有無にかかわらず)を使用しない理由はありません。ある日、CまたはPascalを使用するためにFORTRANを廃止することを決めた人々を思い浮かべてください。
topchef

23
@grigory-カスケード更新/削除、途方もなく非効率的なクエリ構造など、Hibernateの問題を理解するために何日も無駄に費やしてきた多くの経験と話します。そのため、Hibernateの知識だけで良い最終製品が得られるとは考えられません。プロジェクトのライフサイクル全体で、Hibernate(およびORMの拡張)は節約よりも時間がかかるというのが私の経験です
oxbow_lakes

8
Hibernateの使用経験が非常に少ないことを残念に思います。自分は重いデータベース/ SQL /ストアドプロシージャ/ JDBCスクールから来ています。私は改心しているとは言えません-上記のすべてのテクノロジーには、まだ存在する場所があります。ただし、汎用Java 3層アプリケーション(サイズに関係なく)の最初の選択肢はORMテクノロジー(できればJPA 2)です。その他は、レガシーコード、統合、専門知識、バッチ処理の多い要件、リアルタイムなどの要因に基づいて検討されます。異なるデータベーステクノロジースタックにアプローチする(またはしない)パフォーマンスなど。
topchef

3
上記の「クイックウィン」の定義に完全に同意しません。Hibernatein Action(stackoverflow.com/questions/96729/…)(そしてJPA 1ですが、JPA 2の方が優れています)を理解して、このテクノロジーのパワーとカバレッジを完全に理解します持っています。
topchef

7
私は少し調査を行い、SpringはSpring DAO(static.springsource.org/spring/docs/3.0.x/…)を推奨しなくなりました。「推奨される統合スタイルは、プレーンなHibernate、JPA、およびJDO APIに対してDAO をコーディングすることです。 SpringのDAOテンプレートを使用する古いスタイルは推奨されなくなりました。 "...これはあなたが推奨していたものですか?もしそうなら、なぜ彼らはそれを勧めないのですか?
User1、2011年

23

JDOが死んでいる

JDOは実際には死んでいないので、事実を確認してください。JDO 2.2は2008年10月にリリースされました。JDO2.3は開発中です。

これはApacheの下でオープンに開発されています。JPAのリリースよりも多くのリリースがあり、そのORM仕様は、JPA2が提案した機能よりもまだ先行しています。


12
DataNucleusがXcaliaやKodoを気にしていないことを多くのユーザーが証明しているように、人々は間違いなくこれを使用しています。JDOとJPAが同じ市場を埋めていないという基本的な考え方を見逃しています。JPAはRDBMSのみです。JDOはデータストアに依存せず、RDBMSに使用されますが、LDAP、XML、Excel、OODBMなどにも使用されます
DataNucleus

3
特にRDBMS以外のソリューションの人気が高まっているため、RDBMS以外の要素が気に入っています。これは大きな問題です。これは、JPAが十分に速く進化しない場合、「よりオープン」で柔軟な代替手段(JDO)が利用できることは、JPAの人気が必然的に低下傾向にあることを意味します。JDOの方がより完全で、優れている、成熟しているなどの技術的な議論は気にしないでください。好みの問題にはなりません。RDBMSベンダーが疑わしい動作をしていることは理にかなっています-RDBMS市場支配の時代が終わりを迎えるかもしれません。
Manius

2019年も引き続きJDO / DataNucleusを使用しています!現在はバージョン5.xまでですが、開発者の生産性と実行時のパフォーマンスでHibernateに勝っています。最近、Hibernateを使用して大規模なWebアプリに関するコンサルティングを行う必要があり、私が何年も前にアクティブなHIbernateユーザーおよびプロモーターであったときに苦しんでいた痛みを思い出しました。遅延フェッチとしてマークされていても、常に熱心にフェッチされました。「経験豊富な」自己宣言されたHibernateエキスパートによる「ボンネットの下」の知識の完全な欠如は、悲しいことに不安になりましたが、期待されていました。
Volksman、


10

私はJPAを使用しています(ApacheのOpenJPA実装は5年以上前のKODO JDOコードベースに基づいており、非常に高速で信頼性が高い)。仕様をバイパスするように指示する私見の誰もがあなたに悪いアドバイスをしています。私は時間を入れて、確実に報われました。JDOまたはJPAのいずれかを使用すると、最小限の変更でベンダーを変更できます(JPAにはormマッピングがあるため、ベンダーを変更する可能性については1日もかからない)。私のように100以上のテーブルがある場合、これは巨大です。さらに、クラスターごとのキャッシュ排除機能を備えたビルトインキャッシュを利用できます。SQL / Jdbcは高パフォーマンスのクエリに適していますが、透過的な永続性は、アルゴリズムとデータ入力ルーチンの記述にはるかに優れています。私のシステム全体で約16のSQLクエリしかありません(5万行以上のコード)。


8

私はこれを自分で調べたところ、2つの間の大きな違いを見つけることができません。大きな選択は、どの実装を使用するかだと思います。私はDataNucleusプラットフォームを検討しています。これは、データストアに依存しない両方の実装であるためです。


6
答えではなく、DataNucleusの+1。
WolfmanDragon 2009

8

JDOが死んでいると言う人は誰でも、破壊的なFUDモンジャーであり、彼らはそれを知っています。

JDOは健在です。仕様は、はるかに若い制約のあるJPAよりもさらに強力で、成熟しており、高度です。

JPA標準で利用可能なものだけに制限したい場合は、JPAに書き込み、DataNucleusをJPAの他の実装よりも高性能で透過的な永続性実装として使用できます。もちろん、JDOがもたらすモデリングの柔軟性と効率が必要な場合は、DataNucleusもJDO標準を実装します。


1
または、はるかに大きく、その結果として応答性の高いコミュニティを持つ別の(細かい)実装を使用します。はい、一部の人々もそれを大事にします。
Pascal Thivent 2010年

1
そしてあなたはFUDについて話します> :)おかしい。
Pascal Thivent、2010年

2
あなたのコメントは、私がHibernateとJDOの両方を使用していないことを想定しているようです。
Volksman 2010年

2
このスレッドには、DataNucleusの素晴らしさについて、カップルから非常に多くの参照が寄せられているようです。この場所を広告プラットフォームとして使用しないでください。
TM。

3
JPAまたはDataNucleusが関係するすべてのスレッドに同じ必死のマーケティング資料を何度も貼り付けているGolfmanからは驚くべきことは何もありませんでした(1996年から使用されていた以前使用されていました)。
Pascal Thivent、2010

2

同じプロジェクトでHibernate(JPA実装)とJPOX(JDO実装)を使用しました。JPOXは問題なく機能しましたが、かなり迅速にバグに遭遇しました。XAトランザクションの再生に問題がありました。JDOオブジェクトからデータベーススキーマを生成していました。それは毎回データベースに接続したかったのですが、Oracle接続が機能していない場合は面倒です。

その後、Hibernateに切り替えました。しばらくの間純粋なJPAを使用するだけでいじくり回しましたが、マッピングを行うにはHibernate固有の機能のいくつかを使用する必要がありました。複数のデータベースで同じコードを実行するのは非常に簡単です。Hibernateはオブジェクトを積極的にキャッシュしたり、奇妙なキャッシュ動作をしたりすることがあります。Hibernateが処理できないいくつかのDDLコンストラクトがあるため、データベースを初期化するために実行される追加のファイルで定義されます。私がHibernateの問題に遭遇したとき、多くの場合、同じ問題に遭遇した多くの人がいて、ソリューションの検索が簡単になります。最後に、Hibernateは適切に設計され、信頼できるようです。

他の一部の回答者は、SQLの使用のみを提案しています。オブジェクトリレーショナルマッピングの真のキラーユースケースは、テストと開発です。大量のデータを処理するために構築されたデータベースは、通常、高価であり、またはインストールが困難です。テストは困難です。テストに使用できるメモリ内Javaデータベースはたくさんありますが、通常、本番環境では役に立ちません。実際の限られたデータベースを使用できることで、開発の生産性とコードの信頼性が向上します。


1
私の知る限り、JPOXは名前をDataNucleusに変更しました(それ以降、リリースされています)。
ドナルフェロー

2
実際にDataNucleusのバグは、参照している他のソフトウェアよりもはるかに少ないことがわかります。DataNucleusの開発により、他のソフトウェアよりも速い速度でバグの数が減少していることにも気付くでしょう。
DataNucleus 2010

1

2012年5月に、JDO 3.0とDataNucleus 3.0を使用するサンプルWebAppを作成しました。https//github.com/TorbenVesterager/BadAssWebAppのクリーン度を確認して ください。

データベースとJSONクライアントの両方にPOJOを使用しているので、多分それは少しきれいすぎるかもしれませんが、それは楽しいです:)

PS:いくつかのSuppressWarnings注釈が含まれています(IntelliJ 11で開発)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.