XMLマッピングは、オブジェクトのデータ・メンバーを、構造がXMLスキーマ・ドキュメント(XSD)により定義されているXML文書のXMLノードに変換します。
この章の内容は次のとおりです。
複数のタイプのTopLinkマッピングに共通のマッピングの概念と機能の詳細は、第17章「マッピングの概要」を参照してください。
TopLinkでは、表53-1に示すXMLマッピングをサポートしています。
表53-1 TopLinkのXMLマッピングのタイプ
| マッピング・タイプ | 説明 | Oracle JDeveloper |
TopLink Workbench | Java |
|---|---|---|---|---|
|
XMLダイレクト・マッピング(53.3項「XMLダイレクト・マッピング」を参照) |
単純なオブジェクト属性をXML属性またはテキスト・ノードにマップします。 |
![]() |
![]() |
![]() |
|
XMLコンポジット・ダイレクト・コレクション・マッピング(53.4項「XMLコンポジット・ダイレクト・コレクション・マッピング」を参照) |
単純なオブジェクト属性のコレクションをXML属性またはテキスト・ノードにマップします。 |
![]() |
![]() |
![]() |
|
XMLコンポジット・オブジェクト・マッピング(53.5項「XMLコンポジット・オブジェクト・マッピング」を参照) |
シングル・オブジェクトを含む任意の属性をXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してその要素の内容を移入します。 |
![]() |
![]() |
![]() |
|
XMLコンポジット・コレクション・マッピング(53.6項「XMLコンポジット・コレクション・マッピング」を参照) |
オブジェクトの同種のコレクションを含む属性を、複数のXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してそれらの要素の内容を移入します。 |
![]() |
![]() |
![]() |
|
XML任意オブジェクト・マッピング(53.7項「XML任意オブジェクト・マッピング」を参照) |
任意オブジェクトのXMLマッピングは、コンポジット・オブジェクトのXMLマッピングと類似しています(53.5項「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ( |
![]() |
![]() |
![]() |
|
XML任意コレクション・マッピング(53.8項「XML任意コレクション・マッピング」を参照) |
任意コレクションのXMLマッピングは、コンポジット・コレクションのXMLマッピングと類似しています(53.6項「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ( |
![]() |
![]() |
![]() |
|
XMLトランスフォーメーション・マッピング(53.9項「XMLトランスフォーメーション・マッピング」を参照) |
カスタム・マッピングを作成し、1つ以上のXMLノードを使用してJavaクラスの属性に格納するオブジェクトを作成できるようにします。 |
![]() |
![]() |
![]() |
|
XMLオブジェクト参照マッピング(53.10項「XMLオブジェクト参照マッピング」を参照) |
XML文書内の指定された要素を、同じXML文書内の別の要素に対してキーを使用してマップします。 複数のオブジェクトが別のオブジェクトの同じインスタンスを参照する場合には、このマッピングを使用します。 |
![]() |
![]() |
![]() |
|
XMLコレクション参照マッピング(53.11項「XMLコレクション参照マッピング」を参照) |
このマッピングはXMLオブジェクト参照マッピングと類似しています(53.10項「XMLオブジェクト参照マッピング」を参照)。ただし、シングル・オブジェクトのかわりにコレクションを処理する点が異なります。 複数のオブジェクトが別のオブジェクトの同じインスタンスを参照する場合には、このマッピングを使用します。 |
![]() |
![]() |
![]() |
|
XMLバイナリ・データ・マッピング(53.12項「XMLバイナリ・データ・マッピング」を参照) |
バイナリ・データを処理します。このマッピングは、オブジェクト・モデルのバイナリ・データをXMLにマップします。 バイナリ・データをインライン・バイナリ・データ(base64 BLOB)として直接書込み可能にしたり、MtOMまたはSwaRefの添付としてパス・スルー可能にするには、このマッピングを使用します。 |
![]() |
![]() |
![]() |
|
XMLバイナリ・データ・コレクション・マッピング(53.13項「XMLバイナリ・データ・コレクション・マッピング」を参照) |
このマッピングは、XMLバイナリ・データ・マッピングと類似しています(53.12項「XMLバイナリ・データ・マッピング」を参照)。ただし、オブジェクト・モデルのバイナリ・データのコレクションをXMLにマップする点が異なります。 |
![]() |
![]() |
![]() |
|
XMLフラグメント・マッピング(53.14項「XMLフラグメント・マッピング」を参照) |
XMLツリーの一部を1つのノードとして保持します。 |
![]() |
![]() |
![]() |
|
XMLフラグメント・コレクション・マッピング(53.15項「XMLフラグメント・コレクション・マッピング」を参照) |
このマッピングはXMLフラグメント・マッピングと類似しています(53.14項「XMLフラグメント・マッピング」を参照)。ただし、XMLツリーの一部をノードのコレクションとして保持できる点が異なります。 |
![]() |
![]() |
![]() |
|
XML選択オブジェクト・マッピング(53.16項「XML選択オブジェクト・マッピング」を参照) |
単一の属性を、XML文書内のいくつかの異なる要素にマップします。 XMLスキーマ内の単一の選択、または置換グループをマップするには、このマッピングを使用します。 |
![]() |
![]() |
![]() |
|
XML選択コレクション・マッピング(53.17項「XML選択コレクション・マッピング」を参照) |
このマッピングは、XML選択オブジェクト・マッピングと類似しています(53.16項「XML選択オブジェクト・マッピング」を参照)。ただし、このマッピングを使用して、選択または置換グループ要素のコレクションが含まれているXML文書の読取りおよび書込みを処理する点が異なります。 |
![]() |
![]() |
![]() |
|
XML任意属性マッピング(53.18項「XML任意属性マッピング」を参照) |
オブジェクト内の属性を、XML文書の特定の要素に含まれている任意のXML属性にマップします。 |
![]() |
![]() |
![]() |
様々なXMLマッピング・タイプを使用して、XMLの単純および複合型の組合せにJavaオブジェクトの属性をマップできます。
TopLinkでは、クラスのディスクリプタに各クラスのXMLマッピングを格納します。TopLinkでは、ディスクリプタを使用してXML文書からマップされたオブジェクトをインスタンス化し、新規または変更済のオブジェクトをXML文書として格納します。
XMLマッピングを構成するため、Oracle JDeveloper TopLinkエディタまたはTopLink WorkbenchとそのGUI環境を使用してディスクリプタのプロパティを設定し、マッピングを構成することをお薦めします。
この項では、次の内容を含む、TopLink XMLマッピングに固有の概念について説明します。
例53-1に示すXML文書について考えてみます。
例53-1 XML文書
<EMPLOYEE ID="123">
<NAME>Jane Doe</NAME>
<ADDRESS>
<STREET>123 Any St.</STREET>
<CITY>MyCity</CITY>
</ADDRESS>
</EMPLOYEE>
一般的に、TopLink XMLマッピングを使用すると、単純型(NAMEなど)または複合型(ADDRESSなど)にJavaクラスをマップできます。
具体的には、XML属性(IDなど)およびテキスト・ノード(NAMEなど)にJavaオブジェクトの単純な属性をマップできます。JavaオブジェクトのリレーションシップをXML要素(ADDRESSなど)にマップすることもできます。
表53-2では、各TopLink XMLマッピングによってサポートされているXML単純および複合型を示します。
表53-2 XML単純および複合型でのXMLマッピングのサポート
| マッピング | XML属性 | XMLテキスト・ノード | XML要素 |
|---|---|---|---|
|
XMLダイレクト(53.3項「XMLダイレクト・マッピング」を参照) |
|
|
|
|
XMLコンポジット・ダイレクト・コレクション(53.4項「XMLコンポジット・ダイレクト・コレクション・マッピング」を参照) |
|
|
|
|
XMLコンポジット・オブジェクト(53.5項「XMLコンポジット・オブジェクト・マッピング」を参照) |
|
|
|
|
XMLコンポジット・コレクション(53.6項「XMLコンポジット・コレクション・マッピング」を参照) |
|
|
|
|
XML任意オブジェクト(53.7項「XML任意オブジェクト・マッピング」を参照) |
|
|
|
|
XML任意コレクション(53.8項「XML任意コレクション・マッピング」を参照) |
|
|
|
|
XMLトランスフォーメーション(53.9項「XMLトランスフォーメーション・マッピング」を参照) |
|
|
|
|
XMLオブジェクト参照(53.10項「XMLオブジェクト参照マッピング」を参照) |
|
|
|
|
XMLコレクション参照(53.11項「XMLコレクション参照マッピング」を参照) |
|
|
|
|
XMLバイナリ・データ(53.12項「XMLバイナリ・データ・マッピング」を参照) |
|
|
|
|
XMLバイナリ・データ・コレクション(53.13項「XMLバイナリ・データ・コレクション・マッピング」を参照) |
|
|
|
|
XMLフラグメント(53.14項「XMLフラグメント・マッピング」を参照) |
|
|
|
|
XMLフラグメント・コレクション(53.15項「XMLフラグメント・コレクション・マッピング」を参照) |
|
|
|
|
XML選択オブジェクト(53.16項「XML選択オブジェクト・マッピング」を参照) |
|
|
|
|
XML選択コレクション(53.17項「XML選択コレクション・マッピング」を参照) |
|
|
|
|
XML任意属性(53.18項「XML任意属性マッピング」を参照) |
|
|
|
リレーショナル・データベースのマッピングとは異なり、XMLでマッピングが永続化される順序は重要です。
Transformersなどのマッピング・コンポーネント(53.9項「XMLトランスフォーメーション・マッピング」を参照)を定義する順序など、TopLink(Oracle JDeveloper TopLinkエディタ、TopLink WorkbenchまたはJavaコード)でXMLマッピングを定義する順序は、その順序に反映され、それによりTopLinkはXML文書でデータを永続化します。
TopLinkでは、XPath文を使用して効率的にJavaオブジェクトの属性をXML文書の場所にマップします。
XPathの主な特性は次のとおりです。
各XPath文が、ディスクリプタで指定されているコンテキスト・ノードに関連しています。
XPathにはノード・タイプ、パス、および位置の情報を含めることができます。
XPathはsetXPathメソッドを使用してマッピング上に指定されます。
XMLマッピングでのXPathの使用方法の詳細は、17.2.7項「マッピングおよびXPath」を参照してください。
XMLダイレクト・マッピング(53.3項「XMLダイレクト・マッピング」を参照)、コンポジット・ダイレクト・コレクション・マッピング(53.4項「XMLコンポジット・ダイレクト・コレクション・マッピング」を参照)、およびそれらのサブクラスを使用して、XML文書にxsd:listおよびxsd:unionタイプをマップできます。
詳細は、17.2.8項「マッピングとxsd:listおよびxsd:unionタイプ」を参照してください。
XMLスキーマで、xs:anyおよびxs:anyTypeを使用するデータ・タイプに対応する要素と複合型を定義できます。XMLマッピングXMLAnyObjectMappingおよびXMLAnyCollectionMappingを使用して、そのような要素と複合型にオブジェクトをマップできます。
表53-3は、xs:anyおよびxs:anyTypeの一般的なアプリケーションで使用するXMLマッピングを示します。詳細は、指定のXMLマッピング・タイプを参照してください。
表53-3 XMLマッピングとXMLスキーマxs:anyおよびxs:anyType
| 使用するXMLマッピング | マッピング対象のXMLスキーマ定義 |
|---|---|
|
|
|
|
タイプ タイプ |
脚注1 minOccursとmaxOccurs はともに1と等価です。
脚注2 maxOccursは1より大きな値です。
XMLコンポジット・オブジェクト・マッピングおよびそのサブクラスを構成(53.5項「XMLコンポジット・オブジェクト・マッピング」を参照)して、次のXSD構造を使用してjaxb:classに対応できます。
all
sequence
choice
group
詳細は、17.2.9項「マッピングとjaxb:classのカスタマイズ」を参照してください。
XML文書でXMLDirectMapping、XMLCompositeDirectCollectionMappingまたはそれらのサブクラスとともにJAXBTypesafeEnumConverterを使用して、Java属性を型保証列挙にマップできます。
詳細は、17.2.10項「マッピングおよびJAXB型保証列挙」を参照してください。
既存のTopLink XMLマッピングがニーズを満たしていない場合、XMLマッピングの拡張機能(オブジェクト・タイプ、シリアライズ・オブジェクト、タイプ変換コンバータ、シンプル・タイプ・トランスレータなど)を使用してカスタムXMLマッピングを作成できます。詳細は、17.2.6項「マッピング・コンバータおよびトランスフォーマ」を参照してください。
TopLink XMLでのソースにキーのある状態でのマッピングのサポートにより、1対1および1対多マッピングを使用して、XML文書内の指定された要素を、同じXML文書内の別の要素に対してキーを使用してマップできます。
複数のオブジェクトが別のオブジェクトの同じインスタンスを参照する場合には、このマッピングを使用します。
ソースにキーのある状態では、oracle.toplink.ox.mappings.XMLObjectReferenceMappingおよびXMLCollectionReferenceMappingを使用します。
デプロイXMLおよびプロジェクト・クラスを使用して、このマッピングを構成します。
詳細は、次を参照してください。
置換グループは、XMLスキーマで提供されているメカニズムです。置換グループを使用して、要素を他の要素に置換できます。詳細は、http://www.w3.org/TR/2001/REC-xmlschema-0-20010502/#SubsGroupsのXML Schema Primerを参照してください。
TopLinkのXMLChoiceObjectMapping(53.16項「XML選択オブジェクト・マッピング」を参照)およびXMLChoiceCollectionMapping(53.17項「XML選択コレクション・マッピング」を参照)を使用して、置換グループを処理します。
XMLテキスト・ノードの文字列としての読取りなど、複合コンテンツを処理するには、TopLinkのXMLAnyCollectionMapping(53.8項「XML任意コレクション・マッピング」を参照)を使用します。
この機能は、setMixedContentメソッドを介して有効にします。
TopLinkは、javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>およびそのサブクラスの使用をサポートしています。これにより、JAXBで任意のJavaクラスを使用できます。
XmlAdapterは、marshalメソッドとunmarshalメソッドを介して、カスタム・マーシャリングに対するJavaタイプの適用を可能にします。
詳細は、https://jaxb.dev.java.net/nonav/jaxb20-pfd/api/index.htmlのJAXB 2.0の仕様を参照してください。
XMLダイレクト・マッピングでは、XMLテキスト・ノードにJava属性を直接マップします。XMLダイレクト・マッピングは、次のような状況で使用できます。
詳細は、第55章「XMLダイレクト・マッピングの構成」を参照してください。
この項では、次のような場合のXMLダイレクト・マッピングの使用方法について説明します。
例53-2のXMLスキーマであると仮定して、図53-1は、対応するXML文書内にある単純なテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-3は、Javaでのこのマッピングの構成方法を示します。
例53-4のXMLスキーマであると仮定して、図53-2は、対応するXML文書内にある順序での個々のテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-5は、Javaでのこのマッピングの構成方法を示します。
例53-4 単純な順序でのテキスト・ノードへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-5 単純な順序でのテキスト・ノードへのXMLダイレクト・マッピングのJava
XMLDirectMapping firstNameMapping = new XMLDirectMapping();
firstNameMapping.setAttributeName("firstName");
firstNameMapping.setXPath("first-name/text()");
XMLDirectMapping lastNameMapping = new XMLDirectMapping();
lastNameMapping.setAttributeName("lastName");
lastNameMapping.setXPath("last-name/text()");
例53-6のXMLスキーマであると仮定して、図53-3は、対応するXML文書内のサブ要素にあるテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-7は、Javaでのこのマッピングの構成方法を示します。
例53-6 サブ要素でのテキスト・ノードへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="personal-info">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-7 サブ要素でのテキスト・ノードへのXMLダイレクト・マッピングのJava
XMLDirectMapping firstNameMapping = new XMLDirectMapping();
firstNameMapping.setAttributeName("firstName");
firstNameMapping.setXPath("personal-info/first-name/text()");
XMLDirectMapping lastNameMapping = new XMLDirectMapping();
lastNameMapping.setAttributeName("lastName");
lastNameMapping.setXPath("personal-info/last-name/text()");
例53-8のXMLスキーマであると仮定して、図53-4は、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-9は、Javaでのこのマッピングの構成方法を示します。
例53-8 位置によるテキスト・ノードへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" maxOccurs="2"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-9 位置によるテキスト・ノードへのXMLダイレクト・マッピングのJava
XMLDirectMapping firstNameMapping = new XMLDirectMapping();
firstNameMapping.setAttributeName("firstName");
firstNameMapping.setXPath("name[1]/text()");
XMLDirectMapping lastNameMapping = new XMLDirectMapping();
lastNameMapping.setAttributeName("lastName");
lastNameMapping.setXPath("name[2]/text()");
例53-10のXMLスキーマであると仮定して、図53-5は、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-11は、Javaでのこのマッピングの構成方法を示します。
通常、TopLinkではXML文書のターゲット書式を決定できます。ただし、TopLinkで使用可能な複数のターゲットから、1つを指定する必要がある場合があります。たとえば、java.util.Calendarは、スキーマdate、time、dateTimeのノードのいずれかにマーシャリングできる場合があり、byte[]は、スキーマhexBinaryまたはbase64Binaryノードにマーシャリングできる場合があります。
例53-12のXMLスキーマであると仮定して、図53-6は、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例53-13は、Javaでのこのマッピングの構成方法を示します。
例53-12 指定のスキーマ・タイプへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="picture" type="xsd:hexBinary"/>
<xsd:element name="resume" type="xsd:base64Binary"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-13 指定のスキーマ・タイプへのXMLダイレクト・マッピングのJava
XMLDirectMapping pictureMapping = new XMLDirectMapping();
pictureMapping.setAttributeName("picture");
pictureMapping.setXPath("picture/text()");
XMLField pictureField = (XMLField) pictureMapping.getField();
pictureField.setSchemaType(XMLConstants.HEX_BINARY_QNAME);
XMLDirectMapping resumeMapping = new XMLDirectMapping();
resumeMapping.setAttributeName("resume");
resumeMapping.setXPath("resume/text()");
XMLField resumeField = (XMLField) resumeMapping.getField();
resumeField.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
例53-14のXMLスキーマであると仮定して、図53-7は、空白区切りトークンのStringとしてオブジェクト・モデルにリストを表すときの、対応するXML文書のxsd:listタイプへのXMLダイレクト・マッピングを示します。例53-15は、Javaでのこのマッピングの構成方法を示します。
例53-14 listフィールドへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="tasks" type="tasks-type"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="tasks-type">
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
例53-16のXMLスキーマであると仮定して、図53-8は、対応するXML文書にマップできるJavaクラスを示します。このクラスのshoeSize属性に注目してください。unionフィールドを使用するとき、対応する属性は、適用できるすべての値を格納可能である必要があります。
例53-16 unionフィールドへのXMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="shoe-size" type="size-type"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="size-type">
<xsd:union memberTypes="xsd:decimal xsd:string"/>
</xsd:simpleType>
</xsd:schema>
図53-9は、XML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例53-16のスキーマに準拠しています。TopLinkでXML文書をアンマーシャリングすると、変換が成功するまで各unionタイプが試行されます。unionの最初のスキーマ・タイプはxsd:decimalです。「10.5」が有効な小数であるため、TopLinkではその値を適切なタイプに変換します。Object属性が適切な値をトリガーできるほど詳細である場合、TopLinkではかわりにそのタイプを使用します。そうでない場合、TopLinkではデフォルト値(この場合はBigDecimal)を使用します。この動作はJavaコードでオーバーライドできます。
図53-10は、別のXML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例53-16のスキーマに準拠しています。このドキュメントでは値「M」は有効なxsd:decimalタイプではないため、次のunionタイプが試行されます。次のunionタイプはxsd:stringで、変換を実行できます。
例53-17は、Javaでのこのマッピングの構成方法を示します。
例53-17 unionタイプへのXMLダイレクト・マッピングのJava
XMLDirectMapping shoeSizeMapping = new XMLDirectMapping();
shoeSizeMapping.setAttributeName("shoeSize");
XMLUnionField shoeSizeField = new XMLUnionField();
shoeSizeField.setXPath("shoe-size/text()");
shoeSizeField.addSchemaType(XMLConstants.DECIMAL_QNAME);
shoeSizeField.addSchemaType(XMLConstants.STRING_QNAME);
shoeSizeMapping.setField(shoeSizeField);
デフォルトの変換をオーバーライドするには、次のようにXMLUnionFieldメソッドaddConversionを使用します。
shoeSizeField.addConversion(XMLConstants.DECIMAL_QNAME, Float.class);
例53-18のXMLスキーマであると仮定して、図53-11は、対応するXML文書内にあるunionOfLists XMLダイレクト・マッピングを示します。例53-19は、Javaでのこのマッピングの構成方法を示します。
例53-18 unionOfLists XMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="vacation" type="unionOfLists"/>
<xsd:simpleType name="unionOfLists">
<xsd:union memberTypes="xsd:double">
<xsd:simpleType>
<xsd:list itemType="xsd:date"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:list itemType="xsd:integer"/>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
</xsd:schema>
この例では、有効なXML文書にすべてのxsd:double、すべてのxsd:dateまたはすべてのxsd:integerのいずれかの値が含まれていることに注意してください。
例53-20のXMLスキーマであると仮定して、図53-12は、対応するXML文書にマップできるJavaクラスを示します。例53-21は、Javaでのこのマッピングの構成方法を示します。
例53-20 unionOfUnions XMLダイレクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="vacation" type="unionOfUnions"/>
<xsd:simpleType name="unionOfUnions">
<xsd:union>
<xsd:simpleType>
<xsd:union>
<xsd:simpleType>
<xsd:list itemType="xsd:date"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:list itemType="xsd:integer"/>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
<xsd:simpleType>
<xsd:union>
<xsd:simpleType>
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:list itemType="xsd:float"/>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
</xsd:schema>
例53-21 unionOfUnions XMLダイレクト・マッピングのJava
XMLDirectMapping vacationMapping = new XMLDirectMapping();
vacationMapping.setAttributeName("vacation");
XMLUnionField vacationField = new XMLUnionField();
vacationField.setXPath("vacation/text()");
vacationField.addSchemaType(XMLConstants.DATE_QNAME);
vacationField.addSchemaType(XMLConstants.INTEGER_QNAME);
vacationField.addSchemaType(XMLConstants.STRING_QNAME);
vacationField.addSchemaType(XMLConstants.FLOAT_QNAME);
vacationMapping.setField(vacationField);
ノードのタイプをXMLスキーマで定義していない場合は、XMLダイレクト・マッピングを構成してxsi:type属性を使用し、タイプ情報を提供できます。
例53-22のXMLスキーマ・フラグメントであると仮定して、図53-13は、対応するXML文書にマップできるJavaクラスを示します。
例53-22 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピングのスキーマ
...
<xs:element name="area-code" type="anySimpleType"/>
<xs:element name="number" type="anySimpleType"/>
...
図53-14は、XML文書のシンプル・タイプ・トランスレータによるXMLダイレクト・マッピングを示します。このXML文書は例53-22のスキーマに準拠しています。
例53-23は、Javaでのこのマッピングの構成方法を示します。
例53-23 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピングのJava
XMLDirectMapping numberMapping = new XMLDirectMapping();
numberMapping.setAttributeName("number");
numberMapping.setXPath("number/text()");
XMLField numberField = (XMLField) numberMapping.getField();
numberField.setIsTypedTextField(true);
詳細は、17.2.6.4項「シンプル・タイプ・トランスレータ」を参照してください。
XMLコンポジット・ダイレクト・コレクション・マッピングでは、単純なオブジェクト属性のJavaコレクションをXML属性とテキスト・ノードにマップします。多重度設定を使用して、コレクションとして要素を指定します。XMLスキーマを使用すると、発生数の最大値と最小値を定義できます。XMLコンポジット・ダイレクト・コレクション・マッピングは、次のような状況で使用できます。
詳細は、第56章「XMLコンポジット・ダイレクト・コレクション・マッピングの構成」を参照してください。
この項では、次を実行した場合のXMLコンポジット・ダイレクト・コレクション・マッピングの使用方法について説明します。
例53-24のXMLスキーマであると仮定して、図53-15は、対応するXML文書内にあるテキスト・ノードの単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-25は、Javaでのこのマッピングの構成方法を示します。
例53-24 単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="task" type="xsd:string" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-26のXMLスキーマであると仮定して、図53-16は、対応するXML文書内にあるサブ要素のテキスト・ノードの順序へのコンポジット・ダイレクト・コレクションXMLマッピングを示します。例53-27は、Javaでのこのマッピングの構成方法を示します。
例53-26 サブ要素の順序へのXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="tasks">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="task" type="xsd:string" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-28のXMLスキーマであると仮定して、図53-17は、対応するXML文書内にあるサブ要素のテキスト・ノードの順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-29は、Javaでのこのマッピングの構成方法を示します。
例53-28 複数属性へのXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="tasks" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="task" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
コレクションを単独ノードにマップする際、ノードの内容はスペースで区切られたリストとして扱われます。
例53-30のXMLスキーマであると仮定して、図53-18は、対応するXML文書内にある単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-31は、Javaでのこのマッピングの構成方法を示します。
例53-30 単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="tasks" type="tasks-type"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="tasks-type">
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
図53-18 単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピング

例53-32のXMLスキーマであると仮定して、図53-19は、対応するXML文書内にある単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-33は、Javaでのこのマッピングの構成方法を示します。
例53-32 単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:attribute name="tasks" type="tasks-type"/>
</xsd:complexType>
<xsd:simpleType name="tasks-type">
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
例53-34のXMLスキーマであると仮定して、図53-20は、対応するXML文書内にあるlistOfUnions XMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-35は、Javaでのこのマッピングの構成方法を示します。
例53-34 listOfUnions XMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="vacation" type="listOfUnions"/>
<xsd:simpleType name="listOfUnions">
<xsd:list>
<xsd:simpleType>
<xsd:union memberTypes="xsd:date xsd:integer"/>
</xsd:simpleType>
</xsd:list>
</xsd:simpleType>
</xsd:schema>
例53-35 listOfUnions XMLコンポジット・ダイレクト・コレクション・マッピングのJava
XMLCompositeDirectCollectionMapping mapping = new XMLCompositeDirectCollectionMapping();
mapping.setAttributeName("myattribute");
XMLUnionField field = new XMLUnionField("listOfUnions/text()");
mapping.addSchemaType(new Qname(url,"int"));
mapping.addSchemaType(new Qname(url,"date"));
mapping.setField(field);
mapping.useSingleElement(false);
例53-36のXMLスキーマであると仮定して、図53-21は、対応するXML文書内にあるunionOfLists XMLコンポジット・ダイレクト・コレクション・マッピングを示します。例53-37は、Javaでのこのマッピングの構成方法を示します。
例53-36 unionOfLists XMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="vacation" type="unionOfLists"/>
<xsd:simpleType name="unionOfLists">
<xsd:union memberTypes="xsd:double">
<xsd:simpleType>
<xsd:list itemType="xsd:date"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:list itemType="xsd:integer"/>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
</xsd:schema>
図53-21 unionOfLists XMLコンポジット・ダイレクト・コレクション・マッピング

この例では、有効なXML文書にすべてのxsd:double、すべてのxsd:dateまたはすべてのxsd:integerのいずれかの値が含まれていることに注意してください。
例53-37 unionOfLists XMLコンポジット・ダイレクト・コレクション・マッピングのJava
XMLCompositeDirectCollectionMapping mapping = new XMLCompositeDirectCollectionMapping();
mapping.setAttributeName("myattribute");
mapping.useSingleElement(false);
XMLUnionField unionField = new XMLUnionField("UnionOfLists/text()");
field.addSchemaType(new Qname(url," integer"))
field.addSchemaType (new Qname(url," date"))
field.addSchemaType (new Qname(url," double"))
field.setUsesSingleNode(false);
デフォルトでは、TopLinkは、XMLコンポジット・ダイレクト・コレクション・マッピングによって読み取られたノード値をStringのタイプのオブジェクトとして取り扱います。コレクションのコンテンツ・タイプを指定することで、この動作をオーバーライドできます。
例53-38のXMLスキーマであると仮定して、図53-22は、対応するXML文書内にある単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。コレクションのコンテンツ・タイプをCalendarと指定するようにマッピングを構成します。例53-39は、Javaでのこのマッピングの構成方法を示します。
例53-38 指定のコンテンツ・タイプによるXMLコンポジット・ダイレクト・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="employee" type="employee-type"/>
<xsd:complexType name="employee-type">
<xsd:sequence>
<xsd:element name="vacation" type="xsd:string" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
図53-22 指定のコンテンツ・タイプによるXMLコンポジット・ダイレクト・コレクション・マッピング

XMLコンポジット・オブジェクト・マッピングは、2つのクラス間のリレーションシップを表します。XMLでは、「被所有」クラスは、「所有」クラスを表す要素タグ内にネストされます。XMLコンポジット・オブジェクト・マッピングは、次のような状況で使用できます。
詳細は、第57章「XMLコンポジット・オブジェクト・マッピングの構成」を参照してください。
コンポジット・オブジェクトには、同じレコードを親としてマップできます。
|
注意: コンポジット・オブジェクトがマップする各ノードは連続している必要があります。 |
例53-40のXMLスキーマであると仮定して、図53-23は、対応するXML文書内にある親レコードへのXMLコンポジット・オブジェクト・マッピングを示します。例53-41は、Javaでのこのマッピングの構成方法を示します。
例53-40 親レコードへのXMLコンポジット・オブジェクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-42のXMLスキーマであると仮定して、図53-24は、対応するXML文書内にある要素へのXMLコンポジット・オブジェクト・マッピングを示します。例53-43は、Javaでのこのマッピングの構成方法を示します。
例53-42 要素へのXMLコンポジット・オブジェクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
オブジェクトには、同じ参照クラスへの複数のコンポジット・オブジェクト・マッピングを設定できます。各コンポジット・オブジェクト・マッピングには一意のXPathを設定する必要があります。次の例では、名前による一意のXPathを使用します。
例53-44のXMLスキーマであると仮定して、図53-25は、対応するXML文書内にある異なる要素への、名前によるXMLコンポジット・オブジェクト・マッピングを示します。例53-45は、Javaでのこのマッピングの構成方法を示します。
例53-44 名前による要素へのXMLコンポジット・オブジェクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:element name="billing-address" type="address-type"/>
<xsd:element name="shipping-address" type="address-type"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="address-type">
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-45 名前による要素へのXMLコンポジット・オブジェクト・マッピングのJava
XMLCompositeObjectMapping billingAddressMapping = new XMLCompositeObjectMapping();
billingAddressMapping.setAttributeName("billingAddress");
billingAddressMapping.setXPath("billing-address");
billingAddressMapping.setReferenceClass(Address.class);
XMLCompositeObjectMapping shippingAddressMapping = new XMLCompositeObjectMapping();
shippingAddressMapping.setAttributeName("shippingAddress");
shippingAddressMapping.setXPath("shipping-address");
shippingAddressMapping.setReferenceClass(Address.class);
オブジェクトには、同じ参照クラスへの複数のコンポジット・オブジェクト・マッピングを設定できます。各コンポジット・オブジェクト・マッピングには一意のXPathを設定する必要があります。次の例では位置による一意のXPathを使用します。
例53-46のXMLスキーマであると仮定して、図53-26は、対応するXML文書内にある異なる要素への、位置によるXMLコンポジット・オブジェクト・マッピングを示します。例53-47は、Javaでのこのマッピングの構成方法を示します。
例53-46 位置による要素へのXMLコンポジット・オブジェクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:element name="address" maxOccurs="2">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-47 位置による要素へのXMLコンポジット・オブジェクト・マッピングのJava
XMLCompositeObjectMapping billingAddressMapping = new XMLCompositeObjectMapping();
billinAddressMapping.setAttributeName("billingAddress");
billinAddressMapping.setXPath("address[1]");
billinAddressMapping.setReferenceClass(Address.class);
XMLCompositeObjectMapping shippingAddressMapping = new XMLCompositeObjectMapping();
shippingAddressMapping.setAttributeName("shippingAddress");
shippingAddressMapping.setXPath("address[2]");
shippingAddressMapping.setReferenceClass(Address.class);
XMLコンポジット・コレクション・マッピングは、1対多リレーションシップを表す場合に使用します。コンポジット・コレクションXMLマッピングでは、TopLinkディスクリプタを持つ任意のクラスを参照できます。マップされるオブジェクト内の属性は、Java Collectionインタフェース(VectorやHashSetなど)またはMapインタフェース(HashtableやTreeMapなど)を実装している必要があります。XMLCompositeCollectionMappingクラスでは、マップされたクラスとそのクラスの索引付けタイプを参照できます。
例53-48のXMLスキーマであると仮定して、図53-27は、対応するXML文書内の位置による、異なる要素へのXMLコンポジット・コレクション・マッピングを示します。例53-49は、Collection属性に対するこのマッピングのJavaでの構成方法を示し、例53-50は、Map属性に対するこのマッピングのJavaでの構成方法を示します。
例53-48 XMLコンポジット・コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string"/>
<xsd:element name="last-name" type="xsd:string"/>
<xsd:element name="phone-number">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="number" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例53-49 Collection属性に対するXMLコンポジット・コレクション・マッピングのJava
XMLCompositeCollectionMapping phoneNumbersMapping = new XMLCompositeCollectionMapping();
phoneNumbersMapping.setAttributeName("phoneNumbers");
phoneNumbersMapping.setXPath("phone-number");
phoneNumbersMapping.setReferenceClass(PhoneNumber.class);
例53-50 Map属性に対するXMLコンポジット・コレクション・マッピングのJava
XMLCompositeCollectionMapping phoneNumbersMapping = new XMLCompositeCollectionMapping();
phoneNumbersMapping.setAttributeName("phoneNumbers");
phoneNumbersMapping.setXPath("phone-number");
phoneNumbersMapping.setReferenceClass(PhoneNumber.class);
phoneNumbersMapping.useMapClass(HashMap.class, "getType");
詳細は、第58章「XMLコンポジット・コレクション・マッピングの構成」を参照してください。
XML任意オブジェクト・マッピングはコンポジット・オブジェクトXMLマッピングと類似しています(53.5項「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトがタイプany(Stringなど)である点が異なります。このタイプは、継承または共通インタフェースを介して他の特定のタイプと関連付ける必要はありません。
対応するオブジェクト属性値には、Descriptor、java.lang.Object、java.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。
このマッピングは、次のXMLスキーマ構成で使用できます。
any
choice
substitution groups
参照オブジェクトは、ディスクリプタでデフォルトのルート要素を指定できます(16.2.12項「デフォルトのルート要素」を参照)。
|
注意: 参照オブジェクトの未定義のドキュメント・ルート要素は、コレクション・マッピングおよびオブジェクト・マッピングによるマーシャリング中に無視されます。 |
例53-51のXMLスキーマであると仮定して、図53-28は、この例で使用されているJavaクラスを示します。単独のXML任意オブジェクト・マッピングを使用して、Customer属性contactMethodをマップしています。この属性は、あらゆる値(この例では、Address、PhoneNumber、Stringのインスタンス)を参照できる汎用性を持っている必要があります。
例53-51 XML任意オブジェクト・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="contact-method" type="xsd:anyType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="phone-number" type="xsd:string"/>
</xsd:schema>
図53-29、図53-30および図53-31は、XML任意オブジェクト・マッピングが、例53-51のスキーマに準拠するXML文書のAddress、PhoneNumberおよびStringに(個々に)マップする方法を示します。
例53-52は、Javaでのこのマッピングの構成方法を示します。
例53-52 XML任意オブジェクト・マッピングのJava
XMLAnyObjectMapping contactMethodMapping = new XMLAnyObjectMapping();
contactMethodMapping.setAttributeName("contactMethod");
contactMethodMapping.setXPath("contact-method");
TopLink XMLマッピングでのxs:anyおよびxs:anyTypeのサポートの詳細は、53.2.5項「xs:anyとxs:anyTypeのサポート」を参照してください。
詳細は、第59章「XML任意オブジェクト・マッピングの構成」を参照してください。
XML任意コレクション・マッピングは、コンポジット・コレクションのXMLマッピングと類似しています(53.6項「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ(Stringなど)である点が異なります。このようなタイプは、継承または共通インタフェースを介して相互に関連付ける必要はありません。
対応するオブジェクト属性値には、Descriptor、java.lang.Object、java.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。
このマッピングは、次のXMLスキーマ構成で使用できます。
any
choice
substitution groups
各参照オブジェクト(Stringを除く)は、ディスクリプタでデフォルトのルート要素を指定する必要があります(16.2.12項「デフォルトのルート要素」を参照)。
例53-53のXMLスキーマであると仮定して、図53-32は、この例で使用されているJavaクラスを示します。単独のXML任意コレクション・マッピングを使用して、Customer属性contactMethodsをマップしています。この属性は、あらゆる値(この例では、Address、PhoneNumber、Stringのインスタンス)を参照できる汎用性を持っている必要があります。
例53-53 XML任意コレクション・マッピングのスキーマ
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer" type="customer-type"/>
<xsd:complexType name="customer-type">
<xsd:sequence>
<xsd:element name="contact-methods" type="xsd:anyType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="phone-number" type="xsd:string"/>
</xsd:schema>
図53-33は、XML任意コレクション・マッピングが、例53-53のスキーマに準拠するXML文書内のAddress、PhoneNumber、Stringの各オブジェクトのコレクションにマップする方法を示します。
例53-54は、Javaでのこのマッピングの構成方法を示します。
例53-54 XML任意コレクション・マッピングのJava
XMLAnyCollectionMapping contactMethodsMapping = new XMLAnyCollectionMapping();
contactMethodsMapping.setAttributeName("contactMethods");
contactMethodsMapping.setXPath("contact-methods");
TopLink XMLマッピングでのxs:anyおよびxs:anyTypeのサポートの詳細は、53.2.5項「xs:anyとxs:anyTypeのサポート」を参照してください。
詳細は、第60章「XML任意コレクション・マッピングの構成」を参照してください。
XMLトランスフォーメーション・マッピングを使用すると、カスタム・マッピングを作成できます。カスタム・マッピングでは、1つ以上のXMLノードを使用して、Javaクラスの属性に格納するオブジェクトを作成できます。マーシャリング(書込み)およびアンマーシャリング(読取り)時のカスタム要件を処理するため、トランスフォーメーション・マッピングではユーザー提供のoracle.toplink.mappings.transformersのインスタンス(AttributeTransformer、FieldTransformerなど)をとります。これは非介入型のソリューションであり、これによりドメイン・オブジェクトがこのために特別なインタフェースを実装する必要がなくなります。
図53-34に示すように、oracle.toplink.mappings.transformers.AttributeTransformerインスタンスを使用してトランスフォーメーション・マッピングを構成し、アンマーシャリング時にXMLインスタンスからJava属性へのトランスフォーメーションを実行します。この例では、AttributeTransformerにより、2つのXMLテキスト・ノードを1つのJavaオブジェクトに統合しています。
同様に、マーシャリング時にJava属性からXMLインスタンスへのトランスフォーメーションを実行するため、1つ以上のoracle.toplink.mappings.transformers.FieldTransformerインスタンスを使用してトランスフォーメーション・マッピングを構成します。この例では、各FieldTransformerは、1つのJavaオブジェクト値をXMLテキスト・ノードにマップする役割を担います。
詳細は、第61章「XMLトランスフォーメーション・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLObjectReferenceMappingは、ソースにキーのある状態の集約マッピングです。これにより1対1マッピングを使用して、XML文書内の指定された要素を、同じXML文書内の別の要素に対して1つ以上のキーを使用してマップできます。
複数のオブジェクトが別のオブジェクトの同じインスタンスを参照する場合には、このマッピングを使用します。この場合には、1つのマッピングのみがコンポジットで、残りのマッピングは参照マッピングである必要があります。これらの参照は、1つ以上のキー値に基づいて作成されます。
XMLオブジェクト参照マッピングは、デプロイXMLで完全にサポートされています。
TopLinkでは、このマッピングを使用して、コンポジット・キーをサポートするのみでなく、外部キーのグループ化要素もサポートします。
|
注意: キーにマップされる要素は、一緒にグループ化する必要があります。また、TopLinkは、(個々のキーをそれぞれラップするのではなく)すべてのキーをラップするグループ化要素をサポートします。 |
XMLObjectReferenceMappingは次の情報を取得します。
属性名
参照クラス
次の書式のXPathの値(53.2.3項「XPathのサポート」を参照)のような、ソースとターゲットのキー・ペアのマップ
["project-id/text()","@id"]
addSourceToTargetKeyFieldAssociationメソッドを使用して、ソースとターゲットのXPathペアをマップに追加します。
順序を維持するためのソース・キーのリスト
詳細は、第62章「XMLオブジェクト参照マッピングの構成」を参照してください。
図53-35、例53-55、例53-56および例53-57は、単一キーを使用して、ある要素を別の要素にマップする方法を示します。
例53-55 単一キーの使用 - インスタンス文書
...
<employee id="12">
<name>Joe Brown</name>
<project-id>99</project-id>
</employee>
<project id="99">
<name>Big Project</name>
<budget>100,000</budget>
</project>
...
例53-56は、XMLObjectReferenceMappingを作成し、ソースに単一キーのある状態を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-56 単一キーの使用 - Projectクラス - Employeeディスクリプタ
...
XMLObjectReferenceMapping emp = new XMLObjectReferenceMapping();
emp.setAttributeName("project");
emp.setReferenceClass(Project.class);
emp.addSourceToTargetKeyFieldAssociation("project-id/text()","@id");
empDescriptor.addMapping(emp);
...
例53-57は、ディスクリプタに主キー・フィールドを定義する方法を示します。
図53-35、例53-58、例53-59および例53-60は、コンポジット・キーを使用して、ある要素を別の要素にマップする方法を示します。
例53-58 コンポジット・キーの使用 - インスタンス文書
...
<employee id="12">
<name>Joe Brown</name>
<prj-name>Big Project</prj-name>
<prj-budget>100,000</prj-budget>
</employee>
<project id="99">
<name>Big Project</name>
<budget>100,000</budget>
</project>
...
例53-59は、XMLObjectReferenceMappingを作成し、ソースにコンポジット・キーのある状態を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-59 コンポジット・キーの使用 - Projectクラス - Employeeディスクリプタ
...
XMLObjectReferenceMapping emp = new XMLObjectReferenceMapping();
emp.setAttributeName("project");
emp.setReferenceClass(Project.class);
emp.addSourceToTargetKeyFieldAssociation("prj-name/text()","name/text()");
emp.addSourceToTargetKeyFieldAssociation("prj-budget/text()","budget/text()");
empDescriptor.addMapping(emp);
...
例53-60は、ディスクリプタにコンポジット主キー・フィールドを定義する方法を示します。
JAXBジェネレータは、注釈およびデフォルト値に基づいてデプロイメント・ディスクリプタを生成します。
|
注意: JAXBの仕様には、@XmlID注釈について、次の制約が適用されることが記載されています。
|
図53-35、例53-61、例53-62、例53-63および例53-64は、JAXBの注釈を使用して、あるXML要素を別の要素にマップする方法を示します。
例53-61 JAXBの使用 - オブジェクト・モデル
public class Employee {
@XmlAttribute(name="id")
public String id;
public String name;
@XmlElement(name="project-id")
@XmlIDREF
public Project project;
...
}
public class Project {
@XmlElement(name="project-id")
@XmlID
public String id;
public String name;
public String budget;
...
}
例53-62 JAXBの使用 - インスタンス文書
...
<employee id="12">
<name>Joe Brown</name>
<project-id>99</project-id>
</employee>
<project project-id="99">
<name>Big Project</name>
<budget>100,000</budget>
</project>
...
例53-63は、XMLObjectReferenceMappingを作成し、ソースにキーのある状態を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-63 JAXBの使用 - Projectクラス - Employeeディスクリプタ
...
XMLObjectReferenceMapping emp = new XMLObjectReferenceMapping();
emp.setAttributeName("project");
emp.setReferenceClass(Project.class);
emp.addSourceToTargetKeyFieldAssociation("project-id/text()","@pid");
empDescriptor.addMapping(emp);
...
例53-64は、ディスクリプタに主キー・フィールドを定義する方法を示します。
例53-64 JAXBの使用 - Projectクラス - Projectディスクリプタ
...
XMLDescriptor prjDescriptor = new XMLDescriptor();
prjDescriptor.setJavaClass(Project.class);
prjDescriptor.addPrimaryKeyField("@pid");
...
詳細は、次を参照してください。
oracle.toplink.ox.mappings.XMLCollectionReferenceMappingはソースにキーのある状態の集約マッピングです。これにより1対多マッピングを使用して、XML文書内の指定された要素を、同じXML文書内の別の要素に対して1つ以上のキーを使用してマップできます。
TopLinkでは、このマッピングを使用して、外部キーのグループ化要素をサポートします。
|
注意: キーにマップされる要素は、一緒にグループ化する必要があります。また、TopLinkは、(個々のキーをそれぞれラップするのではなく)すべてのキーをラップするグループ化要素をサポートします。 |
XMLCollectionReferenceMappingは次の情報を取得します。
属性名
参照クラス
次の書式のXPathの値(53.2.3項「XPathのサポート」を参照)のような、ソースとターゲットのキー・ペアのマップ
["project-id/text()","@id"]
addSourceToTargetKeyFieldAssociationメソッドを使用して、ソースとターゲットのXPathペアをマップに追加します。
順序を維持するためのソース・キーのリスト
図53-36、例53-65、例53-66および例53-67は、単一キーを使用して、ある要素を別の要素にマップする方法を示します。
例53-65 単一キーの使用 - インスタンス文書
...
<employee id="12">
<name>Joe Brown</name>
<project-id>99</project-id>
<project-id>199</project-id>
</employee>
<project id="99">
<name>Big Project</name>
<budget>100,000</budget>
</project>
<project id="199">
<name>Bigger Project</name>
<budget>100,000,000</budget>
</project>
...
例53-66は、XMLCollectionReferenceMappingを作成し、ソースに単一キーのある状態を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-66 単一キーの使用 - Projectクラス - Employeeディスクリプタ
...
XMLCollectionReferenceMapping prj = new XMLCollectionReferenceMapping();
prj.useCollectionClass(ArrayList.class);
prj.setAttributeName("projects");
prj.setReferenceClass(Project.class);
prj.addSourceToTargetKeyFieldAssociation("project-id/text()","@id");
empDescriptor.addMapping(prj);
...
例53-67は、ディスクリプタに主キー・フィールドを定義する方法を示します。
例53-67 単一キーの使用 - Projectクラス - Projectディスクリプタ
...
XMLDescriptor prjDescriptor = new XMLDescriptor();
prjDescriptor.setJavaClass(Project.class);
prjDescriptor.addPrimaryKeyField("@id");
...
図53-36、例53-68、例53-69および例53-70は、スペースで区切られたリストとして単一キーを使用して、ある要素を別の要素にマップする方法を示します。
例53-68 スペースで区切られたリストとしての単一キーの使用 - インスタンス文書
... <employee id="12" project-ids="99 199"> <name>Joe Brown</name> </employee> <project id="99"> <name>Big Project</name> <budget>100,000</budget> </project> <project id="199"> <name>Bigger Project</name> <budget>100,000,000</budget> </project> ...
例53-69は、XMLCollectionReferenceMappingを作成し、ソースにスペースで区切られたリストとしての単一キーのある状態を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-69 スペースで区切られたリストとしての単一キーの使用 - Projectクラス - Employeeディスクリプタ
...
XMLCollectionReferenceMapping prj = new XMLCollectionReferenceMapping();
prj.useCollectionClass(ArrayList.class);
prj.setAttributeName("projects");
prj.setReferenceClass(Project.class);
prj.addSourceToTargetKeyFieldAssociation("project-ids","@id");
empDescriptor.addMapping(prj);
...
例53-70は、ディスクリプタに主キー・フィールドを定義する方法を示します。
例53-70 スペースで区切られたリストとしての単一キーの使用 - Projectクラス - Projectディスクリプタ
...
XMLDescriptor prjDescriptor = new XMLDescriptor();
prjDescriptor.setJavaClass(Project.class);
prjDescriptor.addPrimaryKeyField("@id");
...
詳細は、第63章「XMLコレクション参照マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLBinaryDataMappingはダイレクト・マッピング(53.3項「XMLダイレクト・マッピング」を参照)で、バイナリ・データを処理するために使用します。これは、オブジェクト・モデル内のバイナリ・データをXMLにマップします。これにより、バイナリ・データをインライン・バイナリ・データ(base64 BLOB)として直接書込み可能にしたり、MtOMまたはSwaRefの添付としてパス・スルー可能にできます。詳細は、12.16項「XMLのバイナリ・データの保存および取得の最適化」を参照してください。
また、XMLBinaryDataMappingを使用して、添付のマーシャラおよびアンマーシャラ(12.16.1項「添付ファイルのマーシャラおよびアンマーシャラの使用方法」を参照)にコールバックを作成するのみでなく、XPathを設定(53.2.3項「XPathのサポート」を参照)できます。
例53-71は、XMLBinaryDataMappingを作成し、そのプロパティの一部を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-71 XMLバイナリ・データ・マッピングの作成
XMLBinaryDataMapping addressMapping = new XMLBinaryDataMapping();
addressMapping.setXPath("address");
addressMapping.setShouldInlineBinaryData(true);
descriptor.addMapping(addressMapping);
...
詳細は、第64章「XMLバイナリ・データ・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLBinaryDataCollectionMappingはXMLBinaryDataMappingに非常に類似しています(53.12項「XMLバイナリ・データ・マッピング」を参照)。ただし、オブジェクト・モデル内のバイナリ・データのコレクションをXMLにマップする点が異なります。
詳細は、次を参照してください。
例53-72は、XMLBinaryDataCollectionMappingを作成し、そのプロパティの一部を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-72 XMLバイナリ・データ・コレクション・マッピングの作成
XMLBinaryDataCollectionMapping addressMapping =
new XMLBinaryDataCollectionMapping();
addressMapping.setCollectionContentType(type);
addressMapping.setXPath("address");
addressMapping.setShouldInlineBinaryData(true);
descriptor.addMapping(addressMapping);
...
詳細は、次を参照してください。
oracle.toplink.ox.mappings.XMLFragmentMappingはダイレクト・マッピング(53.3項「XMLダイレクト・マッピング」を参照)で、XMLツリーの一部をノードとして保持するために使用できます。
また、XMLFragmentMappingを使用して、XPathを設定することもできます(53.2.3項「XPathのサポート」を参照)。
例53-73は、XMLFragmentMappingを作成し、そのプロパティの一部を設定して、マッピングをディスクリプタに追加する方法を示します。
例53-73 XMLフラグメント・マッピングの作成
XMLFragmentMapping addressMapping = new XMLFragmentMapping();
addressMapping.setXPath("address");
descriptor.addMapping(addressMapping);
...
詳細は、第66章「XMLフラグメント・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLFragmentCollectionMappingはXMLFragmentMappingと類似しています(53.14項「XMLフラグメント・マッピング」を参照)。ただし、XMLツリーの一部をノードのコレクションとして保持できる点が異なります。
例53-74は、XMLFragmentMappingを作成し、XPathを設定(53.2.3項「XPathのサポート」を参照)して、マッピングをディスクリプタに追加する方法を示します。
例53-74 XMLフラグメント・コレクション・マッピングの作成
XMLFragmentCollectionMapping addressMapping =
new XMLFragmentCollectionMapping();
addressMapping.setXPath("address");
descriptor.addMapping(addressMapping);
...
詳細は、第67章「XMLフラグメント・コレクション・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLChoiceObjectMappingを使用して、単一の属性を、XML文書内のいくつかの異なる要素にマップできます。
TopLinkの他のXMLマッピングとは異なり、単一のXPathを設定するかわりに、addChoiceElementメソッドを使用してXPathおよびこのXPathに関連付けられているタイプを次のように指定します。
xmlChoiceObjectMapping.addChoiceElement("mystring/text()", String.class);
xmlChoiceObjectMapping.addChoiceElement("myaddress", Address.class);
これらの要素のいずれかがXML文書で検出された場合は、要素は正しいタイプとして読み取られ、オブジェクトに設定されます。
XMLスキーマ内の単一の選択、または置換グループ(53.2.10項「置換グループ」を参照)をマップするには、このマッピングを使用します。
例53-75は、XMLChoiceObjectMappingを作成し、XPathを設定(53.2.3項「XPathのサポート」を参照)して、マッピングをディスクリプタに追加する方法を示します。
例53-75 XML選択オブジェクト・マッピングの作成
XMLChoiceObjectMapping addressMapping = new XMLChoiceObjectMapping();
addressMapping.setXPath("address", Address.class);
descriptor.addMapping(addressMapping);
...
詳細は、第68章「XML選択オブジェクト・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLChoiceCollectionMappingは、XMLChoiceObjectMappingと類似しています(53.16項「XML選択オブジェクト・マッピング」を参照)。ただし、これを使用して、選択または置換グループ(53.2.10項「置換グループ」を参照)要素のコレクションが含まれているXML文書の読取りおよび書込みを処理する点が異なります。
例53-76は、XMLChoiceCollectionMappingを作成し、XPathを設定して、マッピングをディスクリプタに追加する方法を示します。
例53-76 XML選択コレクション・マッピングの作成
XMLChoiceCollectionMapping addressMapping = new XMLChoiceCollectionMapping();
addressMapping.setXPath("address", Address.class);
descriptor.addMapping(addressMapping);
...
詳細は、第69章「XML選択コレクション・マッピングの構成」を参照してください。
oracle.toplink.ox.mappings.XMLAnyAttributeMappingはデータベース・マッピングで、オブジェクト内の属性を、XML文書の特定の要素に含まれている任意のXML属性にマップするために使用できます。オブジェクト内の属性には、修飾名にキーのある状態の属性値のマップが含まれます(javax.xml.namespace.QName)。指定された要素で見つかった1つ以上の属性が、オブジェクト内の別の属性にすでにマップされている場合は、TopLinkではアンマーシャリング操作でこの属性が無視されます。
XMLAnyAttributeMappingを使用してXPathを設定(53.2.3項「XPathのサポート」を参照)できますが、このタイプのマッピングではこの操作はオプションです。XPathを設定しない場合、マッピングは、現在の要素が直接所有している属性の子を検索します。
例53-77は、XMLAnyAttributeMappingを作成し、XPathを設定して、マッピングをディスクリプタに追加する方法を示します。
例53-77 XML任意属性マッピングの作成
XMLAnyAttributeMapping addressMapping = new XMLAnyAttributeMapping();
addressMapping.setXPath("address", Address.class);
descriptor.addMapping(addressMapping);
...
詳細は、第70章「XML任意属性マッピングの構成」を参照してください。