これはかなり自由な質問です。新しいプロジェクトを開始し、データベースアクセスと統合するためのさまざまなORMを検討しています。
お気に入りはありますか?近づかないようアドバイスすることはありますか?
ORMの使用を停止しました。
その理由は、コンセプトの大きな欠陥ではありません。 Hibernateはうまく機能します。代わりに、クエリのオーバーヘッドが低く、多くの複雑なロジックを大きなSQLクエリに適合させ、処理の多くをデータベースにシフトできることがわかりました。
したがって、JDBCパッケージの使用のみを検討してください。
なし。ORMを使用すると、わずかなメリットで制御が奪われてしまうためです。 ORMの使用に起因する異常をデバッグする必要がある場合、得られる時間の節約は簡単に吹き飛ばされます。さらに、ORMは、開発者がSQLを学習したり、リレーショナルデータベースがどのように機能するか、またこれを自分の利益のために使用することを推奨しません。
多くのORMは優れているため、JDBCの上に抽象化を追加する理由を知る必要があります。 http://www.jooq.org をお勧めします(免責事項:私はjOOQの作成者なので、この答えは偏っています)。 jOOQは次のパラダイムを採用しています。
他にも多くの優れた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))))));
Hibernateは、基本的にJavaの事実上の標準であり、JPAの作成の原動力の1つであったためです。 Springでは優れたサポートがあり、ほぼすべてのJavaフレームワークがサポートしています。最後に、GORMは、Groovyを使用して動的ファインダなどを実行するための非常にクールなラッパーです。
.NET(NHibernate)に移植されているため、そこでも使用できます。
Hibernate、それは:
ORMを使用する理由(および時期)に関するいくつかのポイント:
MyBatis を使用することをお勧めします。 JDBCの上にある薄いレイヤーであり、オブジェクトをテーブルにマップし、プレーンSQLを使用するのは非常に簡単です。すべてを制御できます。
中規模の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();
SimpleORM 。これは単純で魔法がないためです。 Javaコードですべてのメタデータ構造を定義し、非常に柔軟です。
SimpleORMは、リレーショナルデータベースのデータをメモリ内のJavaオブジェクトにマッピングすることにより、Hibernateと同様の機能を提供します。クエリはJavaオブジェクトの観点から指定でき、オブジェクトIDはデータベースキーに合わせられ、オブジェクト間の関係は維持され、変更されたオブジェクトは楽観的ロックでデータベースに自動的にフラッシュされます。
ただし、Hibernateとは異なり、SimpleORMは非常に単純なオブジェクト構造とアーキテクチャを使用して、複雑な解析、バイトコード処理などの必要性を回避します。依存関係(Slf4j)。 (Hibernateは2400Kを超え、さらに約2000Kの依存瓶があります。)これにより、SimpleORMの理解が容易になり、技術的なリスクが大幅に削減されます。
Eclipse Link 、多くの理由がありますが、他のメインストリームソリューションよりも肥大化が少ないように感じます(少なくとも、面倒な膨張は少ない)。
ああ、Eclipse LinkがJPA 2.0のリファレンス実装として選ばれました
自由形式のSQLクエリのJava置換に関する懸念を共有していますが、ORMを批判している人々は、一般にアプリケーション設計が貧弱であるため、そうしていると思います。
真のOODはクラスと関係によって駆動され、ORMはさまざまな関係タイプとオブジェクトの一貫したマッピングを提供します。 ORMツールを使用し、ORMフレームワークがサポートするクエリ言語(Java式ツリー、クエリメソッド、OQLなどを含むがこれらに限定されない)でクエリ式をコーディングすると、間違いなく何かをすることになります。間違っています。つまり、クラスモデルが本来の方法で要件をサポートしていない可能性が高いです。クリーンなアプリケーション設計では、アプリケーションレベルでクエリを実際に必要としません。私は、コードにSQL文字列定数を埋め込むのと同じ方法でORMフレームワークを使用して始めた多くのプロジェクトをリファクタリングしてきましたが、最終的には、一致するとアプリケーション全体がどれだけシンプルで保守可能になるかについて、誰もが驚きました使用モデルでクラスモデルをセットアップします。確かに、検索機能などのようなものにはクエリ言語が必要ですが、クエリは非常に制約されているため、さらに複雑なVIEWを作成し、読み取り専用の永続クラスにマッピングすることで、式を作成するよりも保守と表示がはるかに優れていますアプリケーションのコードの一部のクエリ言語で。 VIEWアプローチはデータベース機能も活用し、具体化により、Javaソース内の手書きSQLよりもパフォーマンス面ではるかに優れたものになります。したがって、重要なアプリケーションがORMを使用しない理由はわかりません。