Oracle TopLinkオブジェクト/XMLマッピングについて
Blaise Doughan

オブジェクト/XMLにおけるインピーダンス不整合

XMLは、データ交換の一般的な形式です。XMLは人間が読み取れる形式になっており、移植可能であることから、Webサービスといった異なるプラットフォーム上で稼働するアプリケーション間でデータを交換するのに最適です。

しかし、多くのアプリケーション・オブジェクトでは、XMLではないプログラム表現が採用されています。XMLはソフトウェア業界で最近普及してきています。このことから、オブジェクト・レベルで作業するためには、データをオブジェクト形式に変換する必要があります。オブジェクトとXMLにも、既知のオブジェクト・リレーショナルにおけるインピーダンス不整合に類似したものが存在します。

DOM、SAX、StAXを使用しない理由

これらAPIは、XMLデータに対して低いレベルのアクセスしか与えないため、多くのアプリケーションにおいて、より高いレベルのオブジェクト抽象化が必要となります。確かにDOMはナビゲートするためのインメモリ・ツリー構造を提供しますが、開発者が使い慣れたドメイン・オブジェクトとは異なります。

サンプル

このサンプルでは、XMLと直接やり取りする際に意識すべきことを、小型のスキーマ・フラグメントを通じて検証します。大きいドキュメントを使用する場合、この種の問題によってXMLデータへアクセスするコードが複雑かつ煩雑になりがちです。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                                  
xmlns="urn:customer-example"
targetNamespace="urn:customer-example"
elementFormDefault="unqualified">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="personal-info">
<xs:complexType>
<xs:sequence>
<xs:element name="first-name" type="xs:string"/>
...
<xs:element name="date-of-birth" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element ref="contact-info"/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:schema>

このサンプルにおいて、XMLスキーマから名前データを取得する上で必要ないくつかの詳細情報を入手します。1つは、customer要素の下にネストされた、personal-info要素の下にあるfirst-name要素へアクセスする方法です。この情報は、XMLドキュメントから取得できません。また、date-of-birth要素がXMLスキーマの日付として入力されているか確認する必要があります。これは、XMLパーサーから取得したStringが、yyyy-mm-ddの形式になっているということです。そうであれば、その情報を使用してStingをjava.util.Calendarへ正常に変換できます。

このほか、注意すべきXMLスキーマのルールがいくつかあります。 elementFormDefault属性の上に表示されるXMLスキーマ・フラグメントが"無制限"に設定されており、ターゲットの名前空間も設定されています。これは、グローバルに宣言された要素は名前空間が必ず制限されており、ローカルに宣言された要素は名前空間が制限されていないという意味です。

低いレベルのパーサーAPIは、使用するには複雑で、XMLスキーマ詳細とコードを組み合わせる場合も煩雑な作業となります。このコードは、スキーマに変更が加えられた場合に管理が難しいという問題もあります。

JAXBについて

JAXBは、ドメインに似たオブジェクトを使用してXMLとのやり取りができます。DOMオブジェクトとは異なり、JAXBコンテンツ・モデルは、XMLスキーマに基づいたXMLドキュメントへの充実した理解を提供します。XMLスキーマがカスタマ情報を含むXMLドキュメントを定義した場合、XMLスキーマ内で、対応するタイプを反映したCustomer、Address、PhoneNumberといったオブジェクトがコンテンツ・モデルに表示されます。XMLスキーマ内にある各タイプに対して、1つのクラスが生成されます。

オブジェクト形式のXMLデータであれば、データ構造を簡単にナビゲートでき、コンテンツ・クラスが持つ属性を探して適宜ナビゲートすることもできます。コンテンツ・モデルでは、このほか特定のXMLデータのルールを使用してJavaの対応するタイプへ変換するなど、タイプにおける問題を解決できます。JAXBでは、さまざまなXMLスキーマ・ルールを非表示にします。名前空間の制限などを扱う論理は、JAXBコンパイラで生成されたアーティファクト内にカプセル化されています。

ただし、JAXBを使用する場合はいくつかの制限があります。JAXBでは、XMLスキーマから開始する必要があります。XMLスキーマをJAXBコンパイラに入力し、仕様に従ってモデル・クラスが出力されます。生成されたコンテンツ・クラスは、単体のXMLスキーマと一致するドキュメントを生成する場合にのみ使用し、新しいJAXBコンテンツ・モデルはXML表現それぞれに対して生成する必要があります。

XMLスキーマに変更が加えられた場合、対応するコンテンツ・クラスは再生成しなければなりません。これらコンテンツ・クラスは更新する必要があるため、これらを使用する各アプリケーションが影響を受けることになります。既存のJavaクラスは、スキーマを持つJAXBと共に使用できません。使用できるのは生成されたクラスのみで、変更できません。

JAXBは標準XML APIよりも使用しやすいですが、XMLデータとより便利で柔軟性の高いやり取りを実現する方法があります。

Oracle TopLinkのオブジェクト-XML機能について

Oracle TopLinkにはオブジェク-XMLサポートの一部としてJAXB 1.0が実装されていますが、Oracle TopLinkでJAXBよりも効率良く進めることができます。Oracle TopLinkには、既存のJavaオブジェクトをXMLにマッピングするためのサポートが含まれています。このマッピングでは、Oracle TopLinkのオブジェクト・リレーショナル・マッピングと酷似した原理を使用します。TopLink Mapping Workbenchというビジュアル・マッピング・エディタを使用すれば、マッピングを生成したりカスタマイズしたりすることができます。Oracle TopLinkは、オブジェクト・モデルがXMLスキーマへどのようにマッピングされるかといった制御機能を備え、開発者に対して最大限の柔軟性を提供します。

オブジェクト・モデルを制御する利点は、多数あります。

  • 適切なパターンや方法を使用して、アプリケーションに特化したドメイン・クラスを設計できる。
  • デフォルトのコンストラクタを使用するなど、アプリケーションに適した方法でオブジェクトをインスタンス化できる。JAXBでは、生成されたファクトリ・クラスを使用してコンテンツ・モデルのオブジェクトがインスタンス化されることが必要です。
  • 独自のクラス・パス依存関係を制御できる。ほとんどのJAXB実装において、アプリケーションにクラス・パス依存関係を追加する生成クラスにベンダー固有のコードが含まれています。

Oracle TopLinkの主要な優位性の1つに、マッピング情報が外部に格納されていて、JavaクラスまたはXMLスキーマに対して変更を必要としないという点があります。そのため、ドメイン・オブジェクトを複数のスキーマにマッピングでき、スキーマが変更された場合は、ドメイン・クラスを修正するかわりにマッピング・メタデータを更新するだけです。

Oracle TopLinkのJAXBコンパイラで生成されたオブジェクトは、基本的にPOJOであり、唯一の違いはJAXB仕様で要求される必須インタフェースを実装することです。Oracle TopLinkのJAXBコンパイラが生成するメタデータは、TopLink Mapping Workbenchでカスタマイズされる生成クラスやマッピングを許可します。カスタム・マッピングにおいても、JAXBランタイムAPIを使用してオブジェクトをマーシャルおよびアンマーシャルできます。

基本的には、クラスが複合タイプへ、オブジェクト関係がXML要素へ、シンプルな属性がテキスト・ノードおよびXML属性へマッピングされます。特に、オブジェクト属性をXMLドキュメントにマッピングする場合、XPath構文を使用してXMLデータの場所を特定できます。使用方法については、次のサンプルで示します。

Oracle TopLinkのサンプル

このサンプルでは、マッピング内のXPath構文を使用することで、personal-info要素へのマッピングを回避する方法を示します。

  



このサンプルでは、XPathに位置情報が含まれています。これによって、ドキュメント内の位置に基づいて要素に意味を持たせることができます。Oracle TopLinkでは、このほかJava Collection内の同名の要素から値を格納できます。

  


これは、XMLデータで作業する際に、強力な柔軟性と生産性を提供する3つのデータ・コンバータ・プラグインとともに、Oracle TopLinkが提供する7つのマッピングの内1つをハイライトしたものです。

まとめと次のステップ

Oracle TopLinkは、すでに使い慣れた既存のオブジェクト・リレーショナル・マッピング機能を補完する、強力で柔軟性の高いオブジェクト/XML機能を提供します。Oracle TopLinkはJAXB 1.0を超えた、XMLデータによる豊富なオブジェクト・レベルのプログラミング環境を開発者に提供しますが、JAXBに準拠している点も重要です。多くの付加価値機能がJAXB 2.0 JSR 222における活動の一部として紹介されています。本稿の著者は同専門委員会のメンバーでもあります。

Oracle TopLink 10g Release 3(10.1.3)をダウンロード

オブジェクト/XML機能は、Oracle TopLink 10g Release 3(10.1.3)に含まれています。ダウンロードは こちら から。

Oracle TopLink OXMについて

Oracle TopLink OXM機能については以下のページに掲載されています。手順に沿ったサンプルの使い方や自分自身でオブジェクト/XMLマッピングを作成する方法などを含んだ完全な概要となっています。

http://www.oracle.com/technology/products/ias/toplink/technical/tips/ox/index.htm

サンプルを試用する

Oracle TopLink OXMのサンプルには、Oracle TopLinkのFoundationサンプルを含めた2つがあります。最初のサンプルはOracle TopLinkが提供するJAXB 1.0サポートを示したもので、2つ目のサンプルは新規オブジェクト/XMLマッピングを使用して既存オブジェクト・モデルをXMLスキーマにマッピングする方法を示します。

http://www.oracle.com/technology/products/ias/toplink/examples/index.html

Webサービスを使用している場合

Oracle TopLinkをWebサービスのカスタム・シリアライゼーション・メカニズムとして使用する方法を紹介します。

http://www.oracle.com/technology/products/ias/toplink/technical/tips/jaxRpc11/index.htm

著者プロフィール

Blaise Doughan シニア・ソフトウェア・エンジニア、Oracle TopLinkのOXMプロジェクト・チームリーダー。JSR 222 JAXB 2.0専門委員会のメンバーでもある。


Copyright (c) Oracle Corporation 2007 All Rights Reserved
Oracle Corporation発行の「Introduction to TopLink Object-XML Mapping」の翻訳版です。

この文書はあくまで参考資料であり、 掲載されている情報は予告なしに変更されるこ とがあります。 万一、誤植などにお気づきの場合 は、オラクル社までお知らせください。 オラクル社は本書の内容に関してい かなる保証もしません。 また、本書の内容に関連したいかな る損害についても責任を負いかねます。

Oracleはオラクル社の登録商 標です。
その他の会社名およ び製品名は、 あくまでその製品および会社を識別 する目的にのみ使用されており、 それぞれの所有者の商標または登録 商標です。