どのJava ORMを好みますか、またその理由は何ですか?[閉まっている]


262

それはかなり自由回答式の質問です。私は新しいプロジェクトを開始し、データベースアクセスと統合するさまざまなORMを検討しています。

お気に入りはありますか?近づかないようにアドバイスすることはありますか?



マイクロORM-プラットフォームのDBアクセステクノロジーの薄いラッパー-sql2o for Java github.com/aaberg/sql2o またはServiceStack.OrmLite for .NET github.com/ServiceStack/ServiceStack.OrmLite
tomaszkubacki

3
ORMを5年以上使用した後、私の個人的な選択はORMよりもSpring JDBCであり、2番目に優れているのはiBatis(MyBatis)です。学習曲線、制御およびパフォーマンスの問題が少ないため、休止状態は嫌いです。

:ここでは本格的なオームズの代替として使用することができ、軽量JDBCラッパーのリスト(も閉じ)であるstackoverflow.com/questions/7137929/...
ヴァジム・

回答:


237

ORMの使用をやめました。

その理由は、コンセプトに大きな欠陥がないためです。Hibernateはうまく機能します。代わりに、クエリのオーバーヘッドが低く、多くの複雑なロジックを大きなSQLクエリに適合させ、処理の多くをデータベースにシフトできることがわかりました。

したがって、JDBCパッケージの使用のみを検討してください。


81
ORMの場合も同じです。最初の開発が迅速で、ORM関連のバグや非効率性を追跡するときにプロジェクトのリソースを大幅に浪費します。また、開発者が特定の最適化されたクエリを記述する必要がないという考えを与えているように見えることも嫌いです。
Eelco

7
ねえ、これは大きな現実のプロジェクトに当てはまりますか?
santiagobasulto 2010年

30
同意する。私はORMを3年以上使用していますが、持続性に関連する問題を解決するためにどれだけの時間が(まだ)無駄にされているのかわかりません。「内部」で何が起こっているかについては、私たちには何の制御もできません。構成が多すぎて効率的に管理できません。一方、私は主要なデータベースをサポートしており、それらの違いを心配する必要はありません。
marcolopes

58
クエリ/トランザクションの複雑さに応じて、両方を使用しないのはなぜですか?相互に排他的ではありません。
両生類、2012年

6
@WillSheppardはいウィル。私はDjango ORMをかなり頻繁に使用していますが、うまく機能します。違いは、Python(およびPerl)の動的な性質にあると思います。JavaでORMを使用するのは面倒です。しかし、動的言語では、それは本当に表現力豊かになる可能性があります。PythonにDSLのようなORMオペレーションを組み込むためのすばらしいプロジェクトがいくつかあり、すばらしいプロジェクトです。
santiagobasulto 2013

97

なし。ORMを使用すると、あまりにも多くの制御が奪われ、小さなメリットしか得られないためです。ORMの使用に起因する異常をデバッグする必要がある場合、得られた時間の節約は簡単に打ち消されます。さらに、ORMは、開発者がSQLを学び、リレーショナルデータベースがどのように機能するか、そしてこれを利益のために使用することを阻止します。


4
私はこの声明に同意します。永続的なコードを記述することによって、総開発時間のうちどれだけが消費されますか?10-15%未満だと思います
adrian.tarau 2009年

16
場合によります。もちろん、特定の種類のデータベースを1つだけ使用している場合は、ORMを使用しないことで簡単に問題を解決できます。ただし、他の種類のデータベースをサポートする必要がある場合、すぐに管理しにくくなる可能性があります。
Jason Baker、

3
「得られた時間の節約は、ORMの使用に起因する異常をデバッグする必要がある場合、簡単に打ちのめされます。」これは、技術の選択を行う際にスキル曲線がまともな要素である場合には当てはまりません。
elsadek 2014

7
あなたの主張は、いかなるライブラリの使用に対しても提供される可能性があります。ORMの最大の利点は、作業単位、オブジェクトマッピング、変更の追跡、遅延読み込み、移行、関係などです。user.profile.givenNameを記述できることは素晴らしいことであり、そのためにデータを格納するためにどのような構造が使用されたかは気にしません。
アレックス

1
どのライブラリに対しても使用できますが、程度は異なります。一般的に私はライブラリーの使用を強く支持しています-なぜ車輪を再発明するのですか ただし、この場合、Hibernateはほとんどの用途で重量が重すぎるため、より軽量なORMの方が好ましいと思います。私の経験は、Hibernateを使用して開発し、Hibernateの詳細を徹底的に学習した数年の経験に基づいています。
サイモン2014年

92

多くのORMは優れています。JDBCに抽象化を追加する理由を知る必要があります。私はあなたにhttp://www.jooq.orgを勧めることができます(免責事項:私はjOOQの作成者なので、この答えは偏っています)。jOOQは次のパラダイムを採用しています。

  • SQLは良いことです。SQLでは、多くのことがかなりうまく表現できます。SQLを完全に抽象化する必要はありません。
  • リレーショナルデータモデルは良いことです。過去40年間で最高のデータモデルを証明しました。XMLデータベースや真にオブジェクト指向のデータモデルは必要ありません。代わりに、会社はOracle、MySQL、MSSQL、DB2またはその他のRDBMSのいくつかのインスタンスを実行しています。
  • SQLには構造と構文があります。JDBCでは「低レベル」の文字列連結、HQLでは「高レベル」の文字列連結を使用して表現しないでください。どちらも構文エラーを保持する傾向があります。
  • 主要なクエリを処理する場合、変数バインディングは非常に複雑になる傾向があります。それは抽象化されるべきものです。
  • POJOは、データベースデータを操作するJavaコードを作成する場合に最適です。
  • POJOは、手動で作成して保守するのが面倒です。コード生成は、進むべき道です。データ型の安全性を含むコンパイルセーフなクエリが作成されます。
  • データベースが最初に来ます。データベース上のアプリケーションは時間の経過とともに変化する可能性がありますが、データベース自体はおそらくより長く持続するでしょう。
  • はい、レガシーデータベースにストアドプロシージャとユーザー定義型(UDT)があります。あなたのデータベースツールはそれをサポートするべきです。

他にも多くの優れたORMがあります。特にHibernateやiBATISには素晴らしいコミュニティがあります。しかし、直感的でシンプルなものを探している場合は、jOOQを試してみます。気に入ると思います!:-)

このサンプルSQLを確認してください。

  // Select authors with books that are sold out
  SELECT * 
    FROM T_AUTHOR a
   WHERE EXISTS (SELECT 1
                   FROM T_BOOK
                  WHERE T_BOOK.STATUS = 'SOLD OUT'
                    AND T_BOOK.AUTHOR_ID = a.ID);

そして、それをjOOQでどのように表現できるか:

  // Alias the author table
  TAuthor a = T_AUTHOR.as("a");

  // Use the aliased table in the select statement
  create.selectFrom(a)
        .whereExists(create.selectOne()
                           .from(T_BOOK)
                           .where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
                           .and(T_BOOK.AUTHOR_ID.equal(a.ID))))));

1
ORMツールは、適切に使用できるほど優れています。ORMツールが魅力のように機能するプロジェクトもありますが、他のツールではまったくうまく適合しません。結局、プロジェクトの要件に合った適切なツールを選択するのは開発チームの責任です。ORMツールは複雑です。残念ながら、すべての開発者の一部だけが、それらがどのように機能するかを理解するために時間を費やします。残りはツールを非難し、それが悪いと言うだけです。問題は、最も賛成された回答が最良のアドバイスを提供しているかどうかです。>したがって、JDBCパッケージの使用のみを検討してください。本当にプレーンJDBCを使用したいですか?
Vlad Mihalcea 16

私は「データベースが最初に来る」ことを許さないようにしています。アプリケーションには、クライアントが要求する機能のビジネスルールが含まれており、データベースの作成を要求することはほとんどありません。これは、実装時に決定される技術的な詳細です。
Kwebble 2016

58

それは基本的にJavaのデファクトスタンダードであり、JPAの作成における原動力の1つだったためです。Springでは優れたサポートが提供されており、ほとんどすべてのJavaフレームワークでサポートされています。最後に、GORMは、Groovyを使用して動的ファインダーなどを実行する、非常に優れたラッパーです。

.NET(NHibernate)にも移植されているので、そこでも使用できます。


4
私は、しかし、重要な追加と、あまりにものHib投票:我々は、JPAのAPIを使用する必要がある唯一の JPA実装がのHibが提供する事実であっても。
Vladimir Dyuzhev、2009年

52

休止状態。

  • 安定している-何年にもわたって存在しており、大きな問題がない
  • ORMフィールドの標準を指示します
  • 規定することに加えて、標準(JPA)を実装します。
  • インターネット上でそれに関するたくさんの情報を持っています。多くのチュートリアル、一般的な問題の解決策などがあります
  • 強力です-非常に複雑なオブジェクトモデルをリレーショナルモデルに変換できます。
  • 主要および中規模のRDBMSをサポートします
  • よく学べば、簡単に操作できます

ORMを使用する理由(および時期)に関するいくつかのポイント:

  • システム内のオブジェクトを操作します(システムが適切に設計されている場合)。JDBCを使用している場合でも、データをオブジェクトに転送できるように、最終的に変換レイヤーを作成することになります。しかし私の考えでは、Hibernateはカスタムメイドのソリューションよりも翻訳に優れています。
  • それはあなたの支配を奪うものではありません。APIにリモート機能がない場合は、非常に細かい部分で制御できます。ネイティブクエリを実行すれば、それを利用できます。
  • 中規模またはそれ以上のシステムでは、保守性を目的とする場合、1トンのクエリ(1か所に分散しているか、分散しているか)を使用する余裕はありません。
  • パフォーマンスが重要でない場合。Hibernateはパフォーマンスのオーバーヘッドを追加しますが、無視できない場合もあります。

HibernateとJPAを比較する場合はHibernateを使用し、JPAとJDOを比較する場合はJDOを使用します。私はJDOがとても好きですが、Hibernateの2つの機能(JDOでは使用できません)が大好きです。1つは@Filtersで、もう1つはバージョンフィールド(楽観的ロック用)を通常のフィールドにマップできますが、これはJDOでは不可能です。 。
アミールパシャザデー

27

MyBatisの使用をお勧めします。これはJDBCの上にある薄いレイヤーであり、オブジェクトをテーブルにマップし、プレーンなSQLを使用するのは非常に簡単で、すべてがあなたの管理下にあります。


10
複雑な読み取りにはIbatis、作成、更新、削除、単純な読み取りには休止状態が最適です。
darpet 2010

19

中規模のJavaSEアプリケーションを書いているときに、Avaje Ebean使って本当に良い経験をしました

標準のJPAアノテーションを使用してエンティティを定義しますが、はるかに単純なAPIを公開します(EntityManagerまたはそのアタッチ/デタッチされたエンティティのいずれもがらくたなし)。また、SQLクエリを使用したり、必要に応じて単純なJDBC呼び出しをイベント化したりすることもできます。

また、クエリ用の非常に優れた流動的でタイプセーフなAPIも備えています。次のようなものを書くことができます:

List<Person> boys = Ebean.find(Person.class)
                                  .where()
                                       .eq("gender", "M")
                                       .le("age", 18)
                                  .orderBy("firstName")
                                  .findList();

6
私は少し奇妙でなければなりません...性別= 'M'、年齢<18のfirstNameで並べられた人から選択してください:-)
Eelco

4
これは、私がjavaで見たより良いormの1つです。シングルトンを使用するという決定は新鮮であり、他のものよりも大きな実用的な利点をそれに与えます。
opsb 2010年

流暢ではなく流暢だと思います。
Montdidier 2015

@opsb技術的にはシングルトンではなくモノステートだと思います。
Montdidier、2015

Avaje Ebean ORMを使い始めるには?ビデオチュートリアル??
Avinash

11

SimpleORMは単純明快でマジックがありません。Javaコードですべてのメタデータ構造を定義し、非常に柔軟です。

SimpleORMは、リレーショナルデータベースのデータをメモリ内のJavaオブジェクトにマッピングすることにより、Hibernateと同様の機能を提供します。クエリはJavaオブジェクトの観点から指定でき、オブジェクトIDはデータベースキーと整合し、オブジェクト間の関係は維持され、変更されたオブジェクトは楽観的ロックでデータベースに自動的にフラッシュされます。

ただし、Hibernateとは異なり、SimpleORMは非常に単純なオブジェクト構造とアーキテクチャを使用して、複雑な解析、バイトコード処理などの必要性を回避します。依存関係(Slf4j)。(Hibernateは2400Kを超え、約2000Kの依存JARです。)これにより、SimpleORMが理解しやすくなり、技術的なリスクが大幅に軽減されます。


まだ使用していませんが、ActiveObjectsは自分自身をWebサイトでHibernate-liteのようなものとして説明しているため、おそらく類似性があります。
アブドラジバリー2009年

10

Eclipse Linkは、多くの理由からですが、他のメインストリームソリューションよりも膨らみが少ないように感じます(少なくとも面倒な膨らみは少なくなっています)。

ああ、Eclipse LinkがJPA 2.0のリファレンス実装として選択されました


5

私はフリーフォームSQLクエリのJava置換に関する懸念を共有していますが、ORMを批判している人々は、一般に貧弱なアプリケーション設計のためにそうしていると思います。

真のOODはクラスと関係によって駆動され、ORMはさまざまな関係タイプとオブジェクトの一貫したマッピングを提供します。ORMツールを使用して、ORMフレームワークがサポートする任意のクエリ言語(Java式ツリー、クエリメソッド、OQLなどを含むがこれに限定されない)でクエリ式をコーディングしてしまう場合、間違い、つまりクラスモデルほとんどの場合、必要な方法で要件をサポートしていません。クリーンなアプリケーション設計では、アプリケーションレベルでのクエリは実際には必要ありません。私は、SQL文字列定数をコードに埋め込むのと同じ方法でORMフレームワークの使用を開始した多くのプロジェクトをリファクタリングしてきましたが、結局のところ、一致したらアプリケーション全体がどれほど単純で保守可能になるかについて誰もが驚かされました使用モデルでクラスモデルをアップします。確かに、検索機能などの場合はクエリ言語が必要ですが、それでもクエリは非常に制約されているため、複雑なVIEWを作成し、それを読み取り専用の永続クラスにマッピングする方が、式を作成するよりも保守と確認がはるかに簡単です。アプリケーションのコード内のクエリ言語で。VIEWアプローチはデータベース機能も活用し、マテリアライズにより、Javaソース内の手書きのSQLよりもパフォーマンス面ではるかに優れています。したがって、重要なアプリケーションがORMを使用しない理由はわかりません。しかし、それでもクエリは非常に制約されているため、さらに複雑なVIEWを作成し、それを読み取り専用の永続クラスにマッピングする方が、アプリケーションのコードでクエリ言語で式を作成するよりも、保守と確認がはるかに簡単です。VIEWアプローチはデータベース機能も活用し、マテリアライズにより、Javaソース内の手書きのSQLよりもパフォーマンス面ではるかに優れています。したがって、重要なアプリケーションがORMを使用しない理由はわかりません。しかし、それでもクエリは非常に制約されているため、さらに複雑なVIEWを作成し、それを読み取り専用の永続クラスにマッピングする方が、アプリケーションのコードでクエリ言語で式を作成するよりも、保守と確認がはるかに簡単です。VIEWアプローチはデータベース機能も活用し、マテリアライズにより、Javaソース内の手書きのSQLよりもパフォーマンス面ではるかに優れています。したがって、重要なアプリケーションがORMを使用しない理由はわかりません。


11
私たちの多くがそうであるように、永続ストアの上にアプリケーションを構築している場合、それがRDBMSであろうとNoSQLフレーバーであろうと、そのストアには独自の効率的なアクセス方法があります。それを抽象化しようとするのは、やりすぎです。「真のOOD」に熱心すぎると、Javaが悪名高い宇宙飛行士のアーキテクチャが手に入ります。
Eelco、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.