HPA、EclipseLink、Toplink、OpenJPAなどを含むJPA(Java Persistence API、基本的にはJava / J2EE / EJBの標準化されたORM API)での作業にかなりの時間を費やした人と言えば、私の一部を共有します観察。
- ORMは高速ではありません。それらは十分であり、ほとんどの場合は適切で問題ありませんが、大量の低レイテンシ環境では、それらはノーノーです。
- JavaやC#のような汎用プログラミング言語では、それらを機能させるために非常に多くの魔法が必要です(たとえば、Javaでのロード時のウィービング、計測など)。
- ORMを使用すると、SQLから離れる(意図しているように見える)のではなく、XMLや注釈/属性を微調整してORMにパフォーマンスの高いSQLを生成させるのにどれだけの時間が費やされているかに驚くでしょう。
- 複雑なクエリの場合、実際に代わるものはありません。JPAと同様に、未加工のSQLでは不可能であるいくつかのクエリがあり、JPAで未加工のSQLを使用する必要がある場合は、きれいではありません(C#/。Netには少なくとも動的な型-var-が多くあります)オブジェクト配列よりも良い);
- ORMを使用する場合、非常に多くの「落とし穴」があります。これには、意図しない動作や予期しない動作、データベースへのSQL更新を実行する機能を組み込む必要があるという事実が含まれます(JPAはデフォルトですべてをキャッシュするため、JPAまたは類似のメソッドでrefresh()を使用して、直接データベースをキャッチしないためです。更新-直接SQL更新の実行は、一般的な実稼働サポートアクティビティです。
- オブジェクトとリレーショナルの不一致は常に問題を引き起こします。このような問題があると、抽象化の複雑さと完全性の間にトレードオフがあります。時々、JPAが行きすぎて、複雑さのヒットが抽象化によって正当化されないリターンを減少させる本当の法則にぶつかると感じました。
もう少し説明が必要な別の問題があります。
Webアプリケーションの従来のモデルは、永続化レイヤーとプレゼンテーションレイヤーを使用することです(おそらくサービスと他のレイヤーが間にありますが、これらはこの議論にとって重要な2つです)。ORMは、永続化レイヤーからプレゼンテーションレイヤー(つまりエンティティ)まで厳密なビューを強制します。
より多くの生のSQLメソッドに対する批判の1つは、1つのクエリで使用されるこれらすべてのVO(値オブジェクト)またはDTO(データ転送オブジェクト)になってしまうことです。これは、ORMを排除するため、ORMの利点として宣伝されています。
物事は、それらの問題がORMでなくなるのではなく、単にプレゼンテーション層に移動することです。クエリ用のVO / DTOを作成する代わりに、通常はビューごとに1つ、カスタムプレゼンテーションオブジェクトを作成します。これはどうですか?私見ではありません。
私はこれについてORMまたはSQLで書きました:まだありますか?。
最近、Javaで選択した永続化テクノロジはibatisです。これは、JPAが実行できる機能の90%以上を実行するSQLのかなり薄いラッパーです(十分に文書化されていませんが、関係のレイジーロードを実行できます)が、オーバーヘッドははるかに少なくなっています(複雑さと実際のコードの観点から)。
これは昨年私が書いたGWTアプリケーションで発生しました。EclipseLinkからサービス実装のプレゼンテーションオブジェクトへの多くの変換。ibatisを使用している場合は、ibatisを使用して適切なオブジェクトを作成し、スタックの上下に渡して渡す方がはるかに簡単です。一部の純粋主義者は、これがBad™であると主張するかもしれません。たぶん(理論的には)そうかもしれませんが、私はあなたに何を伝えますか?