Java Data Objects (JDO) について
Java Data Objects (JDO) は、
Javaオブジェクトの永続性、つまりオブジェクトのデータを永続的に保存し、後で取り出すための仕様です。JDOの大きな特徴は、
ドメインモデルの永続性サービスを透過的に扱える点にあります。これは、通常の
Javaクラスを特別な変更なしに永続化できることを意味します。
JDOの基本
- - 透過的な永続性: JDOでは、Javaクラスが永続的であるために、特定のインターフェースを実装したり、特別なクラスを継承したりする必要はありません。これにより、開発者はビジネスロジックに集中でき、永続化の複雑さを意識せずに済みます。
- - 永続性の定義: オブジェクトの永続性に関する設定は、外部のXMLメタファイルで定義されます。これにより、永続化の設定をJavaコードから分離し、柔軟な設定が可能になります。メタファイルには、ベンダー固有の拡張を含めることもできます。
- - エンハンサ: JDOベンダーは、開発者向けにエンハンサと呼ばれるツールを提供します。エンハンサは、コンパイル済みのJavaクラスファイルを編集し、透過的な永続性が実現できるようにします。これは、バイトコードを修正することで実現されるのが一般的です。
- - 多様なデータストア: JDOは、関係データベース、オブジェクトデータベース、ファイルなど、さまざまなデータストアへの保存をサポートしています。これにより、アプリケーションの要件に応じて適切なデータストアを選択できます。
- - ベンダー間の互換性: JDOで強化されたJavaクラスは、異なるベンダーの実装間でも機能します。これは、一度強化したクラスを別のJDO製品でも利用できることを意味し、柔軟性が高まります。
JDOは
Jakarta EE(旧
Java EE)環境にも統合されています。ベンダー実装は
Jakarta EE Connectorとして提供され、
Jakarta EE transaction service(JTA Transaction Manager)のコンテキストで動作します。これにより、エンタープライズ環境での利用も容易になっています。
JDOとJPA
Enterprise JavaBeans 3.0 (EJB 3.0) では永続性がカバーされていますが、JDOではなく
Java Persistence API (JPA) 1.0が採用されました。JDOとJPAは、
Javaでの永続性を扱うための対立する仕様として存在します。JPAはjavax.persistenceパッケージを利用し、EJB 3.0の一部として定義されています。
- - JPAの特徴: JPAはEJBコンテナを必須とせず、JDOと同様にJava SE環境でも利用できます。ただし、JPAは主にオブジェクト関係マッピング(ORM)の仕様であり、データストアに依存しない透過的なオブジェクト永続化を提供するJDOとは異なります。
- - 普及の違い: JPAはJakarta EEの一部であるため、JDOよりも広く利用されています。JDOの商用製品やオープンソースプロジェクトの中には、JPA APIも実装し、利用者に選択肢を提供しているものもあります。
JDO 2.0 での機能追加
JDO 2.0では、以下の様な機能が追加されました。
- - Disconnected Object Graphs: オブジェクトグラフを永続化せずに扱う機能が追加されました。
- - Standardized ORM Mapping Descriptors: ORMベースのJDO実装向けの標準化されたORMマッピング記述子が追加されました。
- - JDOQL拡張: JDO Query Language (JDOQL) が拡張され、より柔軟なクエリが可能になりました。
- - データベース接続の取得: javax.jdo.PersistenceManagerからjava.sql.Connectionを取得できるようになりました。
- - その他の機能: 名前付きクエリ、フェッチプラン、シーケンス、クエリによる削除、PersistenceManager上の複数のユーザーオブジェクトなどが追加されました。
JDOの関連技術と実装
- - 関連技術: Java Persistence API (JPA)、オブジェクト関係マッピング (ORM)、オブジェクトデータベースなど。
- - 主な実装: JPOX(オープンソースのJDO 2リファレンス実装)、Eclipse JSR 220 ORM、Orient Technologies、JDOinstruments、Speedo、Apache JDOなど。
まとめ
JDOは、
Javaオブジェクトの永続性を透過的に扱うための強力な仕様です。データストアの種類に依存せず、様々な環境で利用できる柔軟性を持っています。JPAと並び、
Javaでのデータ永続化の選択肢として重要な位置を占めています。