ORMは裏でどのように機能しますか?また、Javaで永続オブジェクトを使用する最良の方法は何ですか?
質問
ORMはどのように機能しますか?オブジェクトはBLOBにシリアル化されますか?
Javaでは、JDOがまだこれを行う方法ですか?他に何がありますか? EJB、直接オブジェクトシリアル化、JDOについて多くの話があったようです。
解決
最初の質問に答えるために、 Hibernate in Action 、これはORMを実装するさまざまな方法があることを示しています。
純粋なリレーショナル
を含むアプリケーション全体 ユーザーインターフェースは、 リレーショナルモデルとSQLベース リレーショナル操作。このアプローチ、 大規模の欠陥にもかかわらず システム、優れたソリューションになります 単純なアプリケーションの場合、低 コードの再利用レベルは許容範囲です。 ダイレクトSQLは、すべてで微調整できます。 側面、しかし、などの欠点 移植性の欠如と 保守性は重要であり、 特に長期的には。 多くの場合、このカテゴリのアプリケーション ストアドプロシージャを多用する いくつかの作業を ビジネス層とデータベースへ。
ライトオブジェクトマッピング
エンティティはクラスとして表されます に手動でマッピングされる リレーショナルテーブル。ハンドコーディングされたSQL / JDBC ビジネスロジックから隠されている よく知られているデザインパターンを使用します。 このアプローチは非常に普及しています そして、アプリケーションのために成功しています 少数のエンティティ、または 汎用のアプリケーション、 メタデータ駆動型のデータモデル。保存済み 手順はこの中にあるかもしれません アプリケーションの種類。
メディアオブジェクトマッピング
アプリケーションは、 オブジェクトモデル。 SQLはで生成されます コード生成を使用してビルド時間 ツール、またはフレームワークコードによる実行時。 オブジェクト間の関連付けは 永続性によりサポート メカニズム、およびクエリは オブジェクト指向を使用して指定 表現言語。オブジェクトは 永続層によってキャッシュされます。 A 非常に多くのORM製品と自家製 永続層は少なくともサポートします このレベルの機能。まあいいんじゃない 中規模のアプリケーションに適しています いくつかの複雑なトランザクションでは、 特に、 異なるデータベース製品は 重要。これらのアプリケーションは通常 ストアドプロシージャを使用しないでください。
フルオブジェクトマッピング
フルオブジェクトマッピングのサポート 洗練されたオブジェクトモデリング: 構成、継承、 ポリモーフィズム、および「持続性 パーシステンスレイヤー 透過的な永続性を実装します。 永続クラスは何も継承しません 特別な基本クラスまたは 特別なインターフェースを実装します。 効率的なフェッチ戦略(遅延 および熱心なフェッチ)およびキャッシング 戦略が実装されている アプリケーションに対して透過的に。この 機能のレベルはほとんど 自家製の永続性によって達成 レイヤー-数か月または 開発時間の年。数 商用およびオープンソースのJava ORM ツールはこのレベルを達成しています 品質。このレベルは これで使用しているORMの定義 本。私たちの問題を見てみましょう そのツールによって解決されることを期待 完全なオブジェクトマッピングを実現します。
他のヒント
ORM =オブジェクトリレーショナルマッピング。オブジェクトの属性は、realationalデータベースの列にマップされます。そのマッピングは任意であるため、blobに対して行うことができます。実際には、最も有用なのは自然なマッピング(文字列からVarchars、intから整数など)になりがちです。
JPAはORMの標準を探す場所です。 JPAは、面倒であることが判明したEJB CMPアプローチを置き換えます。 JPAを使用すると、マッピングをJavaアノテーションとして表現できます。また、複数のデータベースをサポートする場合は、構成ファイルでマッピングを指定できます。後者が便利な場合があります。
JPAにはクエリ言語があるため、オブジェクト属性に対してクエリを作成できます。
JPAは、主要なApp ServerベンダーおよびHibernateなどの製品でもサポートされています。
JPAは、EJB CMPよりもJPAを使用するのに適していることがわかりました。
トランザクション管理とセキュリティのためにEJB Session Beansファサードを使用することをお勧めします-アノテーションベースのアプローチにより、EJB 2よりもEJB 3を使いやすく、コーディングのオーバーヘッドを最小限に抑えます。
JDOも実際には標準ORMであり、JPA(1 + 2)よりも完全な仕様を提供します。 JPQLはRDBMSの概念に重点を置いているため、SQLを模倣しています。 JDOQLはJava構文に従うため、よりオブジェクトベースです。アプリがRDBMSから離れると見なされるかどうかによって異なります。もしそうなら、JPAは進むべき道ではありません。 RDBMS専用の場合、JPAは間違いなく考慮事項です。
オブジェクトがBLOBにシリアル化されるかどうかは、構成によって異なります。必要に応じて、複雑なオブジェクトタイプに対してこれを行うことができますが、クエリを実行できなくなります。代わりにネイティブ形式で保持する場合は、クエリを実行して、より効率的なアプリに導くこともできます。
-Andy(DataNucleus-JDOおよびJPAの永続性)