Hibernate vs JPA vs JDO-是非?[定休日]
質問
精通していORMをコンセプトとして、僕も使用設定によりどちらのモ数年前からです。ネプロジェクトしかし、まだに話題のORM Javaといった長期派遣、正社員登用の可能これらのツールです。
でも、今がチャンスが利用もORMツールのためのアプリケーションの試みから離れのレガシィのwebサービス
いることを語ってい差達した後JPA仕様、まさにHibernate図書館、何JDOます。
そこで、この問いには期限がつくろうと思いましたかのご意見:
- その是非に?
- してきますので、この新しいプロジェクト?
- ある一定の条件がいくつかあるが、ほとんどが意味のものをご使用の枠組みに。
解決
一部の注
- JDO、JPAは両仕様になります。
- の考え方をできるスワップJPA実装の場合に制限を加えるコードを利用JPAだけます。(数理計算上の差異の処理のためのJDO.)
- Hibernateとして使用できるなどの実施JPA.
- しかし、Hibernate ーネイティブのAPIは、上記の機能とそのJPA.
芋のものをお勧めしますHibernate.
あのコメント/ご不明な点がございましたら何をするべきなのだ 必要 利用休止固有の特徴です。さまざまですが、これを見て、私の助言することはできない。
だがベンダーエンター、お好みの間にHibernateなどJPAやJDO実装 含む 各種ベンダーの特定の拡張をお決めます。
不要な場合、見通しベンダーエンターは、使用できませんJPAに先進的なベンダーの特定の拡張機能を使用しないJPA.(数理計算上の差異の処理のためのJDO).
実際には、必トレードオフ どのくらい お気にするベンダの提携に対 どのくらい してください。ベンダーの特定の拡張を認識しません。
ありその他の要因もたくさん参加しているようで知っているスタッフ、それぞれの技術をどのくらいの製品のコストのライセンス、その話を信じていることを加えることのない未来のためにJDO、JPA.
他のヒント
あなたはJDOのDataNucleusの実装を評価することを確認してください。そんなに人気があるように思われたが、かなりすぐに、それは100%透明永続化ソリューションではないことに気づいたので、我々は、Hibernateで始まっ。自由にモデル化し、私たちが望むしかし、コーディングの楽しみを奪ったことがあり、あまりにも多くの注意点があり、マニュアルには「あなたがこのような状況を持っている場合、あなたはこのようなコードを書かなければならない」がいっぱいです。 JDOは私が「適切に仕事」にそれを得るために私のコードや私のモデルを調整させ、のことはありませんの持っています。私はデザインとコードの単純なPOJOの私は「メモリに」それらを使用するつもりだったかのように、まだ私はそれらを透過的に持続することができます。
休止状態超えるJDO / DataNucleusの他の利点は、(多分大のためにビルド時間に1秒を追加し、それはオーバーヘッドすべての実行時の反射を持っていないということであり、それは時間のバイトコード拡張を構築使用しているため、より多くのメモリ効率的ですむしろ、Hibernateの実行時の反射パワードプロキシパターンよりもプロジェクト)。
あなたはHibernateで迷惑を見つけるかもしれないもう一つは、あなたが考えるものにあなたが持っている参照が、それは多くの場合、オブジェクトのための「プロキシ」です...オブジェクトであるということです。バイトコードの強化の恩恵がなければ、プロキシパターンは(あなたはトップレベルのオブジェクトに引っ張ったとき、すなわち、あなたのオブジェクトグラフ全体に引っ張って避ける)オンデマンド負荷にできるようにするために必要です。あなたが参照していると思うオブジェクトは、多くの場合、そのオブジェクトのためだけのプロキシであるため、等号とhashCodeをオーバーライドするために準備してください。
ここでは、JDOを取得することはできませんあなたが休止状態で取得します不満の例を示します。
のhttp://blog.andrewbeacock .COM / 2008/08 /どのように実装できる-休止セーフ-equals.html の
http://burtbeckwith.com/blog/?p=53する
、必ず、Hibernateはあなたのためです。 //www.datanucleus:あなたは醜い回避策のモデリング、設計、コーディング、それのどれも上のすべてのあなたの時間を過ごすきれいな、純粋な、オブジェクト指向、モデル駆動型開発を認めるならば、<のhref = "HTTPを評価する数時間を過ごします.ORG」のrel = "nofollowをnoreferrer"> JDO / DataNucleusのに。投資した時間が千倍に返済されます。
アップデート2017年2月
はかなり今の時間DataNucleusのために非常にまっすぐ進むべきであるので、DataNucleusのに休止状態から既存のJPAプロジェクトを移植するJDOの永続性の標準に加えて、JPAの永続性の標準を実装し、あなたは非常にDataNucleusのの、上述の利点の全てを取得することができます少しのコード変更があれば。 そこで問題の観点から、特定の標準、JDO(RDBMS +ノーSQL + ODBMSes +その他)対JPA(のみRDBMS)の選択は、DataNucleusのは、HibernateのみJPAに制限され、両方をサポートしています。
休止状態DBの更新のパフォーマンス
が多い場合は特に - それは現在のトランザクションで変更されたオブジェクトを更新するためにSQLを構築する必要があるときに非常に重要になってくる - ORMを選択する際に考慮すべきもう一つの問題は、その汚れたチェック機構の効率でありますオブジェクト。 SO答えるこの中Hibernateの汚れチェック機構の詳細な技術的な説明があります: Hibernateで JPAは非常に遅いに挿入
この評価は、永続化の枠組みのためのjavaプロジェクトは、私の分析の結果は次の通りである。
私が見ているの賛成での支援 JDO 主として:
- 利用できる非sqlデータソースを,db4o,hbase、ldap、bigtable,apache couchdbが持つ(プラグインのためのcassandra)など。
- 簡単にスイッチからsql非sqlデータソースその逆も成り立ちます。
- ないプロキシオブジェクトのための痛みについてhashcode()は、equals()の実装
- よりPOJOを抑回避策の必要
- 支援より関係分野の種類
の支援に賛成 JPA 主として:
- 人気
- jdoドライバーが必死に車を止
- だが、使用bytecode強化
私は世界的な広まりを見せてpro-JPA投稿にJPAを開発者に明らかになJDO/Datanucleus提供弱引数を利用しないJDO.
私も世界的な広まりを見せて投稿JDOへ移行したユーザーにJDOとも幸せでした。
関JPAがあり、このことによりRDBMSベンダーの支援がどうこうというよりは技術的に優れている。(音のようにVHS/ベータにしました。
JDOでのリファレンス実装Datanucleusはないことが明らかで死亡しているGoogleの採用でGAEと開発のソースコードhttp://sourceforge.net/projects/datanucleus/).
からの苦情JDOによりbytecode充実な説明が見つかっていないのはなぜです。
実際、世界であり、これが十分でないとわNoSQLソリューション、JDOのdatanucleus実施るようになることは、より安全性の高いベット。
ちょっとだけを使用JDO/Datanucleusいないように設定できるスイッチと簡単に利用db4o、イナリを使用しています。でも急速な発展を使用db4oにおいては心配しなくてよいでしょう、DBスキーマとして、そのスキーマは安定した展開するデータベース化します。私も感じることを確信後に、展開すべて/一部の私GAEや分散ストレージ/map-reduceラhbase/hadoop/cassandraなくリファクタリング.
この初期のハードルが始まったDatanucleus少しトリッキー-この文書のdatanucleusサイトはちょっとう-のチュートリアルでないとして容易に追従していた。とはいえ、さらに詳細な書類のAPIとマッピングが非常に良いロサンゼルス生まれの初期学習曲線。
の回答によって違いますので、それぞれ何をしています。されているのではないかと思いクリーン-コード、ベンダー-ロック、pojo志向,nosqlのオプション句より好評です。
ご希望の場合は温かいわを感じることを確認することができまと同様に、他の大多数の開発者/羊を選択し、JPA/hibernate.したい場合はリフト、テスト駆動JDO/Datanucleusの手続きを行ってください心です。
あなたは新しいプロジェクトのためにどちらがお勧めでしょうか?
私はどちらをお勧めします!代わりにJdbcTemplate
、StoredProcedure
とRowMapper
と一緒に春のDAOのRowCallbackHandler
を使用します。
Hibernateで私自身の個人的な経験は、アップフロント保存された時は、あなたが予期しないカスケード更新動作のような問題を理解し、デバッグしようとしている行を下に過ごすことになります無限の日によって相殺して余りあるということです。
リレーショナルDBを使用している場合は、その後、近くにあなたのコードは、あなたが持っているより多くの制御、それにあります。 SpringのDAO層は、定型的なコードの必要性を取り除く一方で、マッピング層の微調整を可能にします。また、それは(もちろん、あなたも休止状態でこれを取得する)あなたは非常に簡単に、これはあなたのコードの中に侵入せずに(AOPを経由して)複雑なトランザクションの振る舞いを追加することができることを意味し、Springのトランザクション層に統合ます。
JDOが死んでいる。
JDOはので、あなたの事実を確認してください実際には死んでいません。 JDO 2.2は2008年10月にリリースされました JDO 2.3は開発中です。
このは、Apacheの下で、公然と開発されています。 JPAよりリリースが持っていた、とそのORMの仕様でもJPA2提案機能の前にまだある。
JDOは、JPAより高度な機能を持っている参照 http://db.apache.org/jdo/ jdo_v_jpa.htmlする
私は(5+歳で信頼性の高い/非常に高速である鼓童JDOコードベースに基づいているのApacheからOpenJPAの実装)JPAを使用しています。私見スペックを回避するために、あなたに伝え誰もがあなたに悪いアドバイスを与えています。私は時間を入れて、間違いなく報われました。 JDOまたはJPAのいずれかを使用すると、最小限の変更(私たちは、おそらくベンダーを変更するために、1日未満を話しているように、JPAのORMマッピングを持っている)とベンダーを変更することができます。私はこれを行うようにあなたが100の+テーブルを持っている場合は巨大です。プラスあなたは、クラスタ単位のキャッシュ立ち退きとそのすべての良いとbuilt0inキャッシングを取得します。 SQL / JDBCは、高性能クエリの罰金ですが、透過的な持続性は、あなたのアルゴリズムとデータ入力ルーチンを作成するためにはるかに優れています。私は私の全体のシステム(コードの50K +ライン)に約16 SQLクエリを持っています。
JDOが死んだという誰もがアストロターフィングのFUDの屋で、彼らはそれを知っています。
JDOは健在です。仕様は、より一層、強力な成熟したと多くの若いとJPAの制約よりも進んでいる。
をあなたはJPAへの書き込みやJPAの他の実装よりも高いパフォーマンス、より透明性の持続性実装としてDataNucleusのを使用することができますJPAの標準で利用できる唯一のものに自分自身を制限する場合。あなたはJDOがもたらすモデリングの柔軟性と効率性をしたい場合はもちろんDataNucleusのも、JDO標準を実装します。
私はこれに自分自身を見てきたと2の間に強力な違いを見つけることができません。私は大きな選択はあなたが使用した実装であると思います。それは、両方のデータ・ストアに依存しない実装があるとして自分自身のために私は DataNucleusののプラットフォームを検討してきました。
私は、同じプロジェクトでのHibernate(JPA実装)とJPOX(JDOの実装)を使用しました。 JPOXは、それが一度にサポートしていませんでしたがどこいくつかのJava 5の言語機能、[OK]を働いたが、かなり迅速にバグに遭遇しました。これは、XAトランザクションと素敵な演奏の問題を抱えていました。私は、JDOオブジェクトからデータベーススキーマを生成していました。これは、データベースにOracleの接続が機能していないが起こる場合は迷惑です毎回接続したかっます。
私たちは、その後、休止状態に切り替え。私達はちょうどしばらくの間、純粋なJPAを使用して周りにおもちゃに、私たちは、マッピングを行うにはHibernate固有の機能の一部を使用する必要がありました。複数のデータベースで同じコードを実行することは非常に簡単です。 Hibernateは積極的にオブジェクトをキャッシュまたはちょうど倍で奇妙なキャッシュの動作を持っているようです。 DDLはHibernateが処理できないので、彼らは、データベースを初期化するために実行される追加のファイルで定義されているいくつかの構築があります。私はHibernateの問題に遭遇したら簡単に解決策をグーグルになり、同じ問題に遭遇してきた多くの人々がしばしばあります。最後に、Hibernateはうまく設計され、信頼性の高いことのようです。
他のいくつかのレスポンダは、単にSQLを使用して提案しています。オブジェクトリレーショナルマッピングのための本当のキラーユースケースは、テストと開発です。大量のデータを処理するために構築されているデータベースは、一般的に高価であり、またはそれらをインストールすることは困難です。彼らはでテストすることは困難です。そこにテストするために使用することができ、インメモリのJavaデータベースのたくさんありますが、一般的に生産のための役に立ちません。本物の、限られたデータベースを使用することができること、開発の生産性とコードの信頼性を向上します。
私はJDO 3.0&DataNucleusの3.0を使用しています2012年5月中にサンプルWebAppのを作った - それがどのようにきれいに見てみましょう: https://github.com/TorbenVesterager/BadAssWebAppする
オーケー、多分私は両方のデータベースとJSONのクライアントのためのPOJOを使用しているため、それは、少しあまりにもきれいだが、それは楽しいです:)
PS:(のIntelliJ 11で開発された)いくつかのSuppressWarningsアノテーションを含む