2 オブジェクト・リレーショナルおよびMOXyの内部の理解
オブジェクト・リレーショナルおよびMOXyアーキテクチャの主な機能は次のとおりです。
メタデータについて
EclipseLinkのメタデータは、アプリケーションの開発とデプロイされたランタイム環境の間の橋渡しをします。
次のものを使用して、メタデータを取得できます。
-
注釈およびpersistence.xmlファイルの要素プロパティ拡張機能永続性プロバイダでは、これらすべてのメタデータのソースを解釈して、実行時にインメモリー・セッションおよびプロジェクトが作成されます。
-
JavaおよびEclipseLink API (この方法は最も労力が必要とされます)。
メタデータを通じて、構成情報をランタイム環境に渡すことができます。ランタイム環境では、永続クラス(Javaオブジェクトまたはエンティティ)およびEclipseLink APIを使用して記述されたコードとともにこの情報を使用して、アプリケーションが完成します。
メタデータ・アーキテクチャの利点
EclipseLinkメタデータ・アーキテクチャによって、多くの重要な利点が提供されます。
-
ドメイン・モデル・オブジェクト内ではなく、XML内にマッピング情報を格納します。
-
メタデータを使用することにより、EclipseLinkはオブジェクト・モデルまたはデータベース・スキーマに介入しません。
-
開発者は、特定の設計を強引に通すことなく、必要に応じてオブジェクト・モデルを設計できるようになります。
-
DBAは、特定の設計を強引に通すことなく、必要に応じてデータベースを設計できるようになります。
-
コード生成(設計、実装、メンテナンスなどの重大な問題の原因になる可能性がある)に依存しません。
-
非介入型です。EclipseLinkに適合するようにオブジェクト・モデルまたはデータベース・スキーマを設計することを開発者に要求するのではなく、メタデータ自らがオブジェクト・モデルおよびデータベース・スキーマに適応します。
EclipseLink JPAを使用すると、標準のJPAの注釈、デプロイXMLまたはその両方を使用して永続性メタデータを柔軟に表現でき、EclipseLink JPAの注釈およびpersistence.xml
のプロパティの拡張機能もオプションで利用できます。
プロジェクト・メタデータの作成
プロジェクトには、EclipseLinkランタイムがオブジェクトをデータ・ソースへマップするために使用するマッピング・メタデータが含まれています。
プロジェクトには、EclipseLinkランタイムがオブジェクトをデータ・ソースへマップするために使用するマッピング・メタデータが含まれています。プロジェクトは、EclipseLinkランタイムが使用するプライマリ・オブジェクトです。
プロジェクト・メタデータの最も重要な内容には、次が含まれます。
-
エンティティ・マッピング
-
データ・ソース・ログイン情報
オブジェクト・リレーショナル・マッピングでは、EclipseLinkランタイムは、JPAの注釈、persistence.xml、EclipseLink JPAの注釈およびpersistence.xmlのプロパティの拡張機能の任意の組合せに基づき、インメモリー・プロジェクトを構成します。
MOXyマッピングでは、EclipseLinkランタイムは、JAXBの注釈とeclipselink-oxmバインディングの組合せを使用します。『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「Overriding and Merging」を参照してください。
エンティティ・マッピング
EclipseLinkは、永続性エンティティをアプリケーションのデータベースにマップします。次のようないくつかのプロジェクト開発へのアプローチがあります。
-
マッピング用のクラスと表のインポート
-
クラスのインポート、および表とマッピングの生成
-
表のインポート、およびクラスとマッピングの生成
-
クラス定義と表定義の作成
最も一般的なソリューションは、モデリング・ツールやJDeveloperのような統合開発環境(IDE)などの開発ツールを使用して永続エンティティを開発すること、および適切なリレーショナル設計ツールを使用してリレーショナル・モデルを開発することです。その後、開発者はJDeveloperを使用して、これら2つのモデルを関連付けるマッピングを作成します。
JDeveloperには、アプリケーションの永続エンティティまたはリレーショナル・モデル・コンポーネントを生成するための機能がいくつか用意されていますが、これらのユーティリティの目的はアプリケーションのラウンドトリップ開発を完了することではなく、迅速な初期開発戦略を支援することのみです。
詳細は、「ディスクリプタの理解」および「マッピングの理解」を参照してください。
データ・ソース・ログイン情報
POJOプロジェクトの場合、データ・ソースへのアクセスに必要な情報を指定するセッション・メタデータでセッション・ログインを構成します。
詳細は、「セッション・メタデータの作成」を参照してください。
セッション・メタデータの作成
EclipseLinkセッションには、データ・ソースにアクセスするために必要な情報が含まれます。セッションは、EclipseLinkランタイムの機能にアクセスするためにアプリケーションが使用するプライマリ・オブジェクトです。
EclipseLinkランタイムは、EclipseLink JPAを使用して、JPAおよびEclipseLinkの注釈、JPAの永続性プロパティ(persistence.xml
ファイル内)およびEclipseLinkのプロパティの拡張機能の任意の組合せに基づき、インメモリー・セッションを構成します。『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「Overriding and Merging」を参照してください。
オブジェクト・リレーショナル・ソリューションについて
EclipseLinkでは、完全なJPA準拠のJPA実装が提供されます。
詳細は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』を参照してください。
オブジェクト・リレーショナル・エンティティ・アーキテクチャの理解
このエンティティ・アーキテクチャは、エンティティ、永続性ユニット、永続性コンテキスト、エンティティ・マネージャ・ファクトリおよびエンティティ・マネージャで構成されています。
次の図に、これらの要素の関係を示します。
-
永続性は、1つ以上のEntityManagerFactoryオブジェクトを作成します。
-
各EntityManagerFactoryは、1つの永続性ユニットによって構成されます。
-
EntityManagerFactoryは、1つ以上のEntityManagerオブジェクトを作成します。
-
1つ以上のEntityManagerは、1つのPersistenceContextを管理します。
エンティティ
エンティティは、アプリケーションで定義されたオブジェクトで、次の特性があります。
-
永続化することが可能です。
-
永続識別子を持ちます(永続識別子とは、エンティティ・インスタンスを一意に識別し、そのインスタンスを同じエンティティ・タイプの他のインスタンスから区別するキーです。エンティティは、データ・ストアにそのエンティティを表現するオブジェクトが存在する場合、永続識別子を持ちます)。
-
エンティティの永続性ビューに関してトランザクション的であるという点で、トランザクション的です(エンティティは、トランザクション内で作成、更新および削除され、変更のデータベースへのコミット時にはトランザクションが必要です)。ただし、メモリー内エンティティは、変更を永続化することなく更新できます。
-
プリミティブ・オブジェクト、プリミティブ・ラッパー・オブジェクトまたは組込みオブジェクトではありません。エンティティは、単一の場所(表の行など)に通常格納される集約された状態のセットを保持する粒度の細かいオブジェクトであり、他のエンティティに対するリレーションシップを持ちます。
エンティティには、エンティティを記述するエンティティ・メタデータも含まれています。エンティティ・メタデータは、データベースに対して永続化されません。これは、エンティティがロードされてから実行時に起動されるまでの間、永続性レイヤーがエンティティを管理するために使用されます。メタデータは、Javaプログラミング要素またはXMLファイル(ディスクリプタ)の注釈として表現できます。詳細は、「エンティティの理解」を参照してください。
現在のリリース以降では、マッピングを自動的に追加できる拡張可能なエンティティを定義および使用できます。この場合、エンティティには、静的属性ではなく、マップ内に拡張された属性が保存されます。次に、エンティティは、eclipselink-orm.xmlマッピング・ファイルを使用して、このマップの値をデータベースにマップする方法を定義します。EclipseLinkでは、動的にマッピングを定義できることに加えて、これらの拡張されたマッピングを保存して外部から管理することもできます。この外部保存によって、アプリケーションの実行中に、拡張されたマッピングを定義できるようになりました。エンティティを拡張可能にする方法の詳細は、『Solutions Guide for EclipseLink』の「Providing Software as a Service」を参照してください。
永続性と永続性ユニット
永続性は、エンティティの特性です。つまり、エンティティはデータ・ストアで表すことができ、後でアクセスできます。
永続性ユニットは、永続化可能なユニットを識別し、それに関連するプロパティを定義します。また、永続化する必要があるオブジェクトも定義します。オブジェクトは、エンティティ・クラス、埋込み可能クラス、マップされたスーパークラスのいずれかです。永続性ユニットでは、エンティティ・マネージャ・ファクトリの構成が提供されます。エンティティ・マネージャ・ファクトリによって作成されたエンティティ・マネージャは、永続性ユニットに定義されたプロパティを継承します。
エンティティ・マネージャ
エンティティ・マネージャは、エンティティに対して操作を実行するAPIコールを有効にします。エンティティ・マネージャを使用してエンティティの作成、読取り、書込みのいずれかを行うまで、エンティティは、非永続性Javaオブジェクトです。エンティティ・マネージャがエンティティへの参照を取得すると、そのエンティティはエンティティ・マネージャによって管理されるようになります。特定の時点でのエンティティ・マネージャ内の管理対象エンティティ・インスタンスのセットは、永続性コンテキストと呼ばれ、同じ永続性IDのJavaインスタンスは、永続性コンテキスト内に特定の時点で1つのみ存在できます。
特定のデータベースを対象とする読取りまたは書込み、特定タイプのオブジェクトの永続化または管理、および特定の永続性プロバイダによる実装を行うようエンティティ・マネージャを構成できます。永続性プロバイダにより、EntityManagerインタフェース実装、Query実装、SQL生成などのJPAの実装が提供されます。エンティティ・マネージャはEntityManagerFactoryによって提供されます。エンティティ・マネージャの構成は、EntityManagerFactoryに依存しますが、永続性ユニットとして個別に定義されます。永続性ユニットに名前を付けることで、各EntityManagerFactoryオブジェクトを区別できます。この方法により、特定のエンティティの操作にどの構成を使用するかをアプリケーションで制御できます。永続性ユニットを記述する構成は、persistence.xmlファイルで定義します。特定の構成をEntityManagerFactoryにバインドするようにリクエストできるようにするために、永続性ユニットに名前を付けます。
注釈を使用したメタデータの追加
注釈は、JPA永続性プロバイダが永続動作を管理するために実行時に解釈できるように、対応するJavaクラス・ファイルにコンパイルされるメタデータを使用してJavaソース・コードを修飾するための簡単な表現手段です。
メタデータ注釈は、構造化メタデータおよび型指定メタデータをソース・コードに添付するJava言語の機能を表します。メタデータ指定には注釈のみで十分であり、XMLを使用する必要はありません。標準のJPA注釈は、javax.persistenceパッケージにあります。
注意:
JPA 2.2では、すべてのJPA注釈をメタ注釈で使用できます。詳細は、JPA仕様(http://jcp.org/en/jsr/detail?id=338)の第10章「Metadata Annotations」を参照してください
EclipseLinkには、Javaソース・コードに簡単にメタデータを追加できるように、一連の独自仕様の注釈が用意されています。メタデータは、対応するJavaクラス・ファイルにコンパイルされ、実行時にJPA永続性プロバイダによって解釈されて、永続性動作が管理されます。注釈は、クラス、メソッドおよびフィールドのレベルに適用できます。
EclipseLinkの注釈では、JPAメタデータの使用を介して現在入手できない一部の機能が公開されています。
-
基本プロパティ: デフォルトでは、EclipseLinkの永続性プロバイダは、シンプル・タイプに対する基本マッピングを自動的に構成します。これらの注釈を使用して、フィールドまたはプロパティのエンティティの即時の状態を微調整します。
-
関係: EclipseLinkには、1対1や1対多などの一部の関係がデフォルトで含まれます。他の関係は、明示的にマップする必要があります。注釈を使用して、エンティティ関係のタイプおよび特性を指定して、これらの関係をデータベースでどのように実装するかを微調整します。
-
埋込みオブジェクト: 埋込みオブジェクトには、それ自体の永続識別子は存在せず、識別子に関しては、エンティティに依存しています。デフォルトで、永続性プロバイダでは、すべてのエンティティがそれ自体の表にマップされることが想定されます。注釈を使用して、他のエンティティが所有するエンティティに対して、この動作をオーバーライドします。
注釈使用の長所と短所
注釈を使用する場合の利点は、次のとおりです。
-
比較的簡単に使用および理解できます。
-
記述しているコード内にインラインのメタデータとして提供されるため、メタデータの適用先となるソース・コードのコンテキストをレプリケートする必要がありません。
注釈の主な短所は、メタデータが不必要にコードに結合されるため、メタデータを変更する場合にソース・コードを変更して再コンパイルする必要があることです。
繰返し可能注釈の使用
同じタイプの複数の注釈を、コードの同じ場所に宣言できるようになりました。
Java SE 8より前は、繰返し注釈ではコンテナ注釈内で注釈をグループ化する必要があり、Javaコンパイラは注釈をコンテナにラップしました。Java SE 8では、コンテナを使用する必要はありません。エンティティ・クラスに複数の繰返し可能注釈で注釈を付けることができ、Javaコンパイラでは、それらをコンテナ注釈に格納するコードが生成されます。
次の例では、繰返し可能な@NamedQuery
注釈を定義しています。
@Target({TYPE}) @Retention(RUNTIME) @Repeatable(NamedQueries.class) public @interface NamedQuery { ... }
@AssociationOverride
@AttributeOverride
@Convert
@JoinColumn
@MapKeyJoinColumn
@NamedEntityGraph
@NamedNativeQuery
@NamedQuery
@NamedStoredProcedureQuery
@PersistenceContext
@PersistenceUnit
@PrimaryKeyJoinColumn
@SecondaryTable
@SqlResultSetMapping
@SequenceGenerator
@TableGenerator
@Repeatable
注釈の詳細は、https://docs.oracle.com/javase/tutorial/java/annotations/repeating.htmlを参照してください。
構成の基本について
TopLinkでは、オブジェクト・リレーショナル・マッピング・プロジェクトにいくつかの構成ファイルが含まれています。
次の項では、オブジェクト・リレーショナル・マッピング・プロジェクトの主な構成ファイルのいくつかについて説明します。
デフォルト注釈値
各注釈には、デフォルト値があります(詳細はJPA仕様を参照)。永続性エンジンにより、アプリケーションの大半に適用されるデフォルトが定義されます。デフォルト値をオーバーライドするには、単に値を指定します。したがって、必ずしも構成値を指定する必要はなく、指定はこの原則の例外となります。これは、例外による構成と呼ばれます。
注意:
必要時に動作を変更できるように、ユーザーはデフォルト値を把握しておく必要があります。
デフォルト値の詳細は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』を参照してください。JPA仕様の第10章「Metadata Annotations」も参照してください。
http://jcp.org/en/jsr/detail?id=338
この構成は例外処理として行われます。つまり、構成ファイルのいずれかに値が指定されていない場合は、デフォルト値が使用されます。
persistence.xmlを使用した永続性ユニットの構成
永続性ユニットでは、エンティティ・マネージャを取得する際に必要な詳細を定義します。エンティティ・マネージャ・ファクトリを取得する場合、永続性ユニットを名前で指定します。永続性ユニットを構成するには、JPA永続性ファイルpersistence.xmlを使用します。ベンダー固有の拡張機能は、<properties>要素を使用して、このファイルに指定できます。
このファイルは、永続性ユニットのJARファイルのMETA-INF/
ディレクトリまたはクラスパスにあります。
詳細は、「永続性ユニットについて」を参照してください。『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「Persistence Property Extensions Reference」も参照してください。
オブジェクト・リレーショナル・データ・タイプ・マッピング
オブジェクト・リレーショナル・データ・タイプ・マッピングは、特定オブジェクトのデータ・メンバー・タイプを、Oracle Databaseのような特別なオブジェクト・リレーショナル・データベースでの格納に最適化された構造化データ・ソース表現に変換します。オブジェクト・リレーショナル・データ・タイプ・マッピングを使用すると、オブジェクト・モデルをオブジェクト・リレーショナル・モデルにマップできます。オブジェクト・リレーショナル・データ・タイプ・マッピングは、オブジェクト・リレーショナル・データ・タイプ・データ・ソース表現をサポートするために最適化された特別のオブジェクト・リレーショナル・データベースにのみ使用できます。
詳細は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』を参照してください。
データ・ソースについて
永続性ユニットの定義で重要なのは、プロバイダが読み書きするデータを見つけることができる場所、つまりデータ・ソースです。
データ・ソースは、通常はデータベースです。データベースの場所は、サーバーのJNDIネームスペースのJDBCデータ・ソースの形式で指定します。
通常、EclipseLinkを使用するアプリケーションは、JTAトランザクションのコンテキストで実行します。データ・ソースの名前は、persistence.xml
ファイルのjta-data-source要素に指定します。アプリケーションがトランザクションのコンテキストで実行されない場合は、resource-localと見なされます。この場合は、non-jta-data-source要素に、データ・ソースの名前を指定します。
XMLスキーマなどのリレーショナル・データベース以外のデータ・ソースも指定できます。
詳細は、「データ・アクセスの理解」を参照してください。
アプリケーションは、スタンドアロン(Java SE)・モードで実行できます。このモードでは、非JTA準拠のデータ・ソースとともに、非Oracleスタックにおいて、サーバーの外部でアプリケーションが実行されます。この場合、JDBCドライバ・クラス、データベースに接続するためにクライアントが使用するURL、データベースにアクセスするためのユーザー名とパスワードなどのドライバ固有の情報を指定する必要があります。アプリケーションをスタンドアロン・モードで実行する方法の詳細および例は、『Solutions Guide for EclipseLink』の「Testing EclipseLink JPA Outside a Container」を参照してください。
EclipseLinkキャッシュについて
EclipseLinkのデフォルトでは、読み取られて永続性ユニットに対して永続化されたすべてのオブジェクトのサブセットがキャッシュされる、共有オブジェクト・キャッシュが使用されます。
共有キャッシュは、ローカルのEntityManagerキャッシュとは異なります。共有キャッシュは、永続性ユニット(EntityManagerFactoryまたはサーバー)の期間存在し、永続性ユニットのすべてのEntityManagerおよびユーザーによって共有されます。ローカルのEntityManagerキャッシュは共有されず、EntityManagerまたはトランザクションの期間のみ存在します。
共有キャッシュの利点は、オブジェクトを読み取ると、同じオブジェクトを再度読み取る際にデータベースにアクセスする必要がないことです。また、問合せを使用してオブジェクトを読み取る場合は、オブジェクトを再作成する必要はなく、オブジェクトの関係も再度フェッチする必要がありません。
共有キャッシュの制限は、JDBC経由または別のアプリケーションやサーバーによってデータベースが直接変更されると、共有キャッシュのオブジェクトが失効することです。
EclipseLinkには、失効データを扱うために、次のようなメカニズムが用意されています。
-
リフレッシュ
-
無効化
-
オプティミスティック・ロック
-
キャッシュ・コーディネーション
-
データベース変更通知(DCN)
共有キャッシュを無効にすることもできます。また、@Cacheや@Cacheable注釈を使用して選択的に有効にしたり、無効にすることもできます。EclipseLinkにはキャッシュするオブジェクトの数や使用するメモリー・サイズを構成するためのいくつかの異なるキャッシュ・ストラテジが用意されています。
キャッシュが最新でないことをアプリケーションが検出した場合、アプリケーションはプログラムでキャッシュをクリア、リフレッシュまたは無効化できます。キャッシュされているオブジェクトのいずれかが使用中の場合にキャッシュをクリアすると、オブジェクト・アイデンティティの問題が発生する場合があるので、無効化する方が安全です。キャッシュされているオブジェクトのいずれも使用中でないことがわかっている場合は、キャッシュをクリアできます。
詳細は、「キャッシュの理解」を参照してください。
キャッシュ動作の定義
EclipseLinkには、キャッシュ・プロパティを定義できる@Cache注釈が用意されています。プロパティには、キャッシュのタイプ、サイズ、リフレッシュ・ルールなどが含まれます。『Java Persistence API (JPA) Extensions Reference for EclipseLink』を参照してください。クラスタ化環境でのキャッシング
あるサーバーでの変更は他のサーバーにキャッシュされているオブジェクトには反映されないため、クラスタ化環境でのキャッシングでは問題が発生する場合があります。これは、読取り専用オブジェクトでは問題になりませんが、頻繁に更新されるオブジェクトでは問題になります。
EclipseLinkには、この問題に対する解決策がいくつか用意されています。
-
頻繁に変更されるクラスに対してはキャッシュを無効にできます。
-
キャッシュ・コーディネーションを使用して、クラスタ内のサーバー間で変更をブロードキャストして、変更されたオブジェクトを更新または無効化できます。
-
存続時間または時刻に基づいてキャッシュを無効化できます。
-
オプティミスティック・ロックを使用して、無効なオブジェクトへの更新を防ぎ、キャッシュ内でオブジェクトが無効化されるようにトリガーすることができます。
詳細は、「クラスタリングおよびキャッシュ・コーディネーション」を参照してください。
データベース問合せについて
EclipseLinkのオブジェクト・リレーショナル・コンポーネントは、様々な問合せをサポートしています。
-
JPQL問合せ
-
SQL問合せ
-
Criteria API問合せ
-
ネイティブSQL問合せ
-
EclipseLink JPA問合せヒント
-
問合せのキャスト
-
問合せ用のOracle拡張機能
-
拡張EclipseLinkネイティブ問合せ
これらの問合せの詳細は、第9章「問合せの理解」を参照してください。
MOXyソリューションについて
EclipseLinkによって提供されるMOXyコンポーネントでは、JavaクラスをXMLスキーマに効率的にバインドできます。MOXyではJAXBが実装されるので、注釈でマッピング情報を提供でき、マッピングをXML形式で保存できます。
JAXB (Java Architecture for XML Binding—JSR 222)は、JavaのXMLバインディングの標準です。JAXBでは、XMLスキーマの概念が100%カバーされています。EclipseLinkでは、JAXBの実装が多くの拡張機能とともに提供されています。
EclipseLink MOXyをJAXBプロバイダとして使用する際には、既存のオブジェクト・モデルをXMLに変換するためのメタデータは不要です。XML表記を微調整する必要がある場合は、(注釈またはXMLを使用して)メタデータを指定できます。
MOXyには、Javaクラス・モデルでスキーマをミラーリングしなくても、複雑なXML構造を処理できる高度なマッピングが多数含まれています。
詳細は、『Developing JAXB Applications EclipseLink MOXy』を参照してください。
JAXBプロバイダとしてのEclipseLink MOXyの使用
MOXyをJAXBプロバイダとして使用するには、JAXBランタイムへのエントリ・ポイントを指定する必要があります。このエントリ・ポイントは、EclipseLink JAXBContextFactoryクラスです。
エントリ・ポイントを識別するには、jaxb.propertiesというテキスト・ファイルを作成して、次のようにJAXBContextFactoryクラスへのパスをjavax.xml.bind.context.factoryコンテキスト・パラメータの値として入力します。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
jaxb.propertiesファイルは、ドメイン・クラスと同じパッケージに存在する必要があります。
MOXyアーキテクチャの理解
MOXyのサンプル・アーキテクチャでは、XMLスキーマから始まります。
次の図に示すように、バインディング・コンパイラは、スキーマから導出されたプログラム・クラスおよびインタフェースのセットにソース・スキーマをバインドします。アプリケーション内のJAXBの注釈が付いたクラスは、スキーマ・コンパイラで生成されるか、開発者がJAXB注釈を既存のJavaクラスに追加した結果によって生成されます。アプリケーションは、データをXML文書にマーシャリングするか、データをコンテンツ・オブジェクトのツリーにアンマーシャリングできます。各コンテンツ・オブジェクトは、導出されたスキーマ、またはスキーマ・ジェネレータによってマップされた既存のプログラム要素のどちらかのインスタンスで、XML内のインスタンスに対応しています。
JAXBコンテキストおよびJAXBコンテキスト・ファクトリ
JAXBContextFactoryクラスは、EclipseLink JAXBランタイムへのエントリ・ポイントです。これは、必須のファクトリ・メソッドを提供し、JAXBContextオブジェクトの新しいインスタンスを作成できます。
JAXBContextFactoryクラスでは、次のことが可能です。
-
クラスの配列およびプロパティ・オブジェクトからのJAXBContextオブジェクトの作成
-
コンテキスト・パスおよびクラスローダーからのJAXBContextオブジェクトの作成
JAXBContextクラスは、JAXB APIに対するクライアントのエントリ・ポイントを提供します。JAXBContextクラスは、メタデータの解釈、スキーマ・ファイルの生成、およびJAXBオブジェクト(Marshaller、Unmarshaller、Binder、IntrospectorおよびValidator)のインスタンスの作成を行います。
MOXyには、JAXBContextオブジェクトを作成する際にいくつかのオプションが用意されています。次のいずれかから開始できます。
-
JAXBの注釈の付いた1つ以上のクラスのリスト
-
Javaクラスのマッピングが定義された1つ以上のEclipseLink XMLバインディング・ドキュメントのリスト
-
クラスとXMLバインディングの組合せ
-
コンテキスト・パスのリスト
MOXyに対するメタデータの提供
MOXyには、MetadataSourceオブジェクトという概念があります。
このオブジェクトによって、マッピング情報をアプリケーションの外部に保存して、アプリケーションのJAXBContextオブジェクトが作成またはリフレッシュされるときにそれを取得できるようになります。MetadataSourceの実装の詳細は、『Developing JAXB Applications EclipseLink MOXy』を参照してください。
XMLバインディングについて
XMLバインディングとは、コンピュータのメモリーのオブジェクトとして、XML文書内に情報を表現する方法です。
これにより、Domain Object Model (DOM)、Simple API for XML (SAX)またはStreaming API for XML (StAX)を使用してXML自身の直接表現からデータを取得しなくても、オブジェクトからXML内のデータにアクセスできるようになります。バインディングする際に、JAXBでは、JPAエンティティのグラフにツリー構造が適用されます。グラフの複数ツリー表現は可能で、選択されたルート・オブジェクトおよびリレーションシップがトラバースする方向に依存します。
EclipseLinkでは、すべての標準JAXB注釈を使用できます。EclipseLinkには、標準注釈に加えて、EclipseLink XMLバインディング・ドキュメントという、メタデータを表現する別の方法も用意されています。XMLバインディングは、マッピング情報を実際のJavaクラスから分離できるだけでなく、次のような高度なメタデータ・タスクにも使用できます。
-
追加のマッピング情報で、既存の注釈を拡張またはオーバーライドできます。
-
Java注釈を使用せずに、すべてのマッピング情報を外部指定できます。
-
複数のバインディング文書にまたがるマッピングを定義できます。
-
具体的なJavaフィールドに対応しない仮想マッピングを指定できます。
詳細は、『Developing JAXB Applications EclipseLink MOXy』を参照してください。