XMLマッピングは、オブジェクトのデータ・メンバーを、構造がXMLスキーマ・ドキュメント(XSD)により定義されているXML文書のXMLノードに変換します。
この章の内容は次のとおりです。
TopLinkでは、表62-1に示すXMLマッピングをサポートしています。
表62-1 TopLinkのXMLへのマッピングのタイプ
| マッピング・タイプ | 説明 | タイプ | TopLink Workbench | Java |
|---|---|---|---|---|
|
|
単純なオブジェクト属性をXML属性またはテキスト・ノードにマップします。 |
基本 |
![]() |
![]() |
|
「XMLコンポジット・ダイレクト・コレクション・マッピング」 |
単純なオブジェクト属性のコレクションをXML属性またはテキスト・ノードにマップします。 |
基本 |
![]() |
![]() |
|
|
シングル・オブジェクトを含む任意の属性をXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してその要素の内容を移入します。 |
基本 |
![]() |
![]() |
|
|
オブジェクトの同種のコレクションを含む属性を、複数のXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してそれらの要素の内容を移入します。 |
基本 |
![]() |
![]() |
|
|
任意オブジェクトのXMLマッピングは、コンポジット・オブジェクトのXMLマッピングと類似しています(「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ( |
詳細 |
![]() |
![]() |
|
|
任意コレクションのXMLマッピングは、コンポジット・コレクションのXMLマッピングと類似しています(「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ( |
詳細 |
![]() |
![]() |
|
|
カスタム・マッピングを作成し、1つ以上のXMLノードを使用してJavaクラスの属性に格納するオブジェクトを作成できるようにします。 |
詳細 |
![]() |
![]() |
様々なXMLマッピング・タイプを使用して、XMLの単純および複合型の組合せにJavaオブジェクトの属性をマップできます。
TopLinkでは、クラスのディスクリプタに各クラスのXMLマッピングを格納します。TopLinkでは、ディスクリプタを使用してXML文書からマップされたオブジェクトをインスタンス化し、新規または変更済のオブジェクトをXML文書として格納します。
XMLマッピングを構成するため、TopLink Workbenchとその豊かなグラフィカル・ユーザー・インタフェース(GUI)環境を使用してディスクリプタのプロパティを設定し、マッピングを構成することをお薦めします。
この項では、次の内容を含む、TopLink XMLマッピングに固有の概念について説明します。
例62-1に示すXML文書について考えてみます。
例62-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など)にマップすることもできます。
表62-2に、各TopLink XMLマッピングによってサポートされているXML単純および複合型を一覧表示します。
リレーショナル・データベースのマッピングとは異なり、XMLでマッピングが永続化される順序は重要です。
Transformersなどのマッピング・コンポーネント(「XMLトランスフォーメーション・マッピング」を参照)を定義する順序など、TopLink(TopLink WorkbenchまたはJavaコード)でXMLマッピングを定義する順序は、その順序に反映され、それによりTopLinkはXML文書でデータを永続化します。
TopLinkでは、XPath文を使用して効率的にJavaオブジェクトの属性をXML文書の場所にマップします。XMLマッピングでのXPathの使用方法の詳細は、「マッピングとXPath」を参照してください。
XMLダイレクト・マッピング(「XMLダイレクト・マッピング」を参照)およびコンポジット・ダイレクト・コレクション・マッピング(「XMLコンポジット・ダイレクト・コレクション・マッピング」を参照)を使用して、XML文書にxsd:listおよびxsd:unionタイプをマップできます。
詳細は、「マッピングとxsd:listおよびxsd:unionタイプ」を参照してください。
XMLスキーマで、xs:anyおよびxs:anyTypeを使用するデータ・タイプに対応する要素と複合型を定義できます。XMLマッピングXMLAnyObjectMappingおよびXMLAnyCollectionMappingを使用して、そのような要素と複合型にオブジェクトをマップできます。
表62-3に、xs:anyおよびxs:anyTypeの一般的なアプリケーションで使用するXMLマッピングを示します。詳細は、指定のXMLマッピング・タイプを参照してください。
表62-3 XMLマッピングとXMLスキーマxs:anyおよびxs:anyType
| 使用するXMLマッピング | マッピング対象のXMLスキーマ定義 |
|---|---|
|
|
|
|
タイプ タイプ |
脚注1 minOccursとmaxOccurs はともに1と等価です。
脚注2 maxOccursは1より大きな値です。
XMLコンポジット・オブジェクト・マッピングを構成(「XMLコンポジット・オブジェクト・マッピング」を参照)して、次のXSD構造を使用してjaxb:classカスタマイズできます。
all
sequence
choice
group
詳細は、「マッピングとjaxb:classのカスタマイズ」を参照してください。
XMLDirectMappingにJAXBTypesafeEnumConverterを使用して、またはXML文書にXMLCompositeDirectCollectionMappingを使用して、Java属性を型保証列挙にマップできます。
詳細は、「マッピングおよびJAXB型保証列挙」を参照してください。
既存のTopLink XMLマッピングがニーズを満たしていない場合、XMLマッピングの拡張機能(オブジェクト・タイプ、シリアライズ・オブジェクト、タイプ変換コンバータ、シンプル・タイプ・トランスレータなど)を使用してカスタムXMLマッピングを作成できます。詳細は、「マッピング・コンバータおよびトランスフォーマ」を参照してください。
XMLダイレクト・マッピングでは、XMLテキスト・ノードにJava属性を直接マップします。XMLダイレクト・マッピングは、次のような状況で使用できます。
詳細は、第64章「XMLダイレクト・マッピングの構成」を参照してください。
この項では、次のような場合のXMLダイレクト・マッピングの使用方法について説明します。
例62-2のXMLスキーマであると仮定して、図62-1では、対応するXML文書内にある単純なテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-3は、Javaでのこのマッピングの構成方法を示しています。
例62-4のXMLスキーマであると仮定して、図62-2では、対応するXML文書内にある順序での個々のテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-5は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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()");
例62-6のXMLスキーマであると仮定して、図62-3では、対応するXML文書内のサブ要素にあるテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-7は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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()");
例62-8のXMLスキーマであると仮定して、図62-4では、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-9は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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()");
例62-10のXMLスキーマであると仮定して、図62-5では、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-11は、Javaでのこのマッピングの構成方法を示しています。
通常、TopLinkではXML文書のターゲット書式を決定できます。ただし、TopLinkで使用可能な複数のターゲットから、1つを指定する必要がある場合があります。たとえば、java.util.Calendarは、スキーマdate、time、dateTimeのノードのいずれかにマーシャリングできる場合があり、byte[]は、スキーマhexBinaryまたはbase64Binaryノードにマーシャリングできる場合があります。
例62-12のXMLスキーマであると仮定して、図62-6では、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-13は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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);
例62-14のXMLスキーマであると仮定して、図62-7では、空白区切りトークンのStringとしてオブジェクト・モデルにリストを表すときの、対応するXML文書のxsd:listタイプへのXMLダイレクト・マッピングを示します。例62-15は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-16のXMLスキーマであると仮定して、図62-8では、対応するXML文書にマップできるJavaクラスを示します。このクラスのshoeSize属性に注目してください。unionフィールドを使用するとき、対応する属性は、適用できるすべての値を格納可能である必要があります。
例62-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>
図62-9に、XML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例62-16のスキーマに準拠しています。TopLinkでXML文書をアンマーシャリングすると、変換が成功するまで各unionタイプが試行されます。unionの最初のスキーマ・タイプはxsd:decimalです。「10.5」が有効な小数であるため、TopLinkではその値を適切なタイプに変換します。Object属性が適切な値をトリガーできるほど詳細である場合、TopLinkではかわりにそのタイプを使用します。そうでない場合、TopLinkではデフォルト値(この場合はBigDecimal)を使用します。この動作はJavaコードでオーバーライドできます。
図62-10に、別のXML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例62-16のスキーマに準拠しています。このドキュメントでは値「M」は有効なxsd:decimalタイプではないため、次のunionタイプが試行されます。次のunionタイプはxsd:stringで、変換を実行できます。
例62-17は、Javaでのこのマッピングの構成方法を示しています。
例62-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);
例62-18のXMLスキーマであると仮定して、図62-11では、対応するXML文書内にあるunionOfLists XMLダイレクト・マッピングを示します。例62-19は、Javaでのこのマッピングの構成方法を示しています。
例62-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のいずれかの値が含まれていることに注意してください。
例62-20のXMLスキーマであると仮定して、図62-12では、対応するXML文書にマップできるJavaクラスを示します。例62-21は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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属性を使用し、タイプ情報を提供できます。
例62-22のXMLスキーマ・フラグメントであると仮定して、図62-13では、対応するXML文書にマップできるJavaクラスを示します。
例62-22 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピングのスキーマ
...
<xs:element name="area-code" type="anySimpleType"/>
<xs:element name="number" type="anySimpleType"/>
...
図62-13 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピングのJavaクラス

図62-14に、XML文書のシンプル・タイプ・トランスレータによるXMLダイレクト・マッピングを示します。このXML文書は例62-22のスキーマに準拠しています。
図62-14 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピング

例62-23は、Javaでのこのマッピングの構成方法を示しています。
例62-23 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピングのJava
XMLDirectMapping numberMapping = new XMLDirectMapping();
numberMapping.setAttributeName("number");
numberMapping.setXPath("number/text()");
XMLField numberField = (XMLField) numberMapping.getField();
numberField.setIsTypedTextField(true);
詳細は、「シンプル・タイプ・トランスレータ」を参照してください。
XMLコンポジット・ダイレクト・コレクション・マッピングでは、単純なオブジェクト属性のJavaコレクションをXML属性とテキスト・ノードにマップします。多重度設定を使用して、コレクションとして要素を指定します。XMLスキーマを使用すると、発生数の最大値と最小値を定義できます。XMLコンポジット・ダイレクト・コレクション・マッピングは、次のような状況で使用できます。
詳細は、第65章「XMLコンポジット・ダイレクト・コレクション・マッピングの構成」を参照してください。
この項では、次のような場合のXMLコンポジット・ダイレクト・コレクション・マッピングの使用方法について説明します。
例62-24のXMLスキーマであると仮定して、図62-15では、対応するXML文書内にあるテキスト・ノードの単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-25は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-26のXMLスキーマであると仮定して、図62-16では、対応するXML文書内にあるサブ要素のテキスト・ノードの順序へのコンポジット・ダイレクト・コレクションXMLマッピングを示します。例62-27は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-28のXMLスキーマであると仮定して、図62-17では、対応するXML文書内にあるサブ要素のテキスト・ノードの順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-29は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
コレクションを単独ノードにマップする際、ノードの内容はスペースで区切られたリストとして扱われます。
例62-30のXMLスキーマであると仮定して、図62-18では、対応するXML文書内にある単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-31は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-32のXMLスキーマであると仮定して、図62-19では、対応するXML文書内にある単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-33は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-34のXMLスキーマであると仮定して、図62-20では、対応するXML文書内にあるlistOfUnions XMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-35は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
図62-20 listOfUnions XMLコンポジット・ダイレクト・コレクション・マッピング

例62-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);
例62-36のXMLスキーマであると仮定して、図62-21では、対応するXML文書内にあるunionOfLists XMLコンポジット・ダイレクト・コレクション・マッピングを示します。例62-37は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
図62-21 unionOfLists XMLコンポジット・ダイレクト・コレクション・マッピング

この例では、有効なXML文書にすべてのxsd:double、すべてのxsd:dateまたはすべてのxsd:integerのいずれかの値が含まれていることに注意してください。
例62-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のタイプのオブジェクトとして取り扱います。コレクションのコンテンツ・タイプを指定することで、この動作をオーバーライドできます。
例62-38のXMLスキーマであると仮定して、図62-22では、対応するXML文書内にある単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングを示します。コレクションのコンテンツ・タイプをCalendarと指定するようにマッピングを構成します。例62-39は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
図62-22 指定のコンテンツ・タイプによるXMLコンポジット・ダイレクト・コレクション・マッピング

XMLコンポジット・オブジェクト・マッピングは、2つのクラス間のリレーションシップを表します。XMLでは、「被所有」クラスは、「所有」クラスを表す要素タグ内にネストされます。XMLコンポジット・オブジェクト・マッピングは、次のような状況で使用できます。
詳細は、第66章「XMLコンポジット・オブジェクト・マッピングの構成」を参照してください。
コンポジット・オブジェクトには、同じレコードを親としてマップできます。
|
注意: コンポジット・オブジェクトがマップする各ノードは連続している必要があります。 |
例62-40のXMLスキーマであると仮定して、図62-23では、対応するXML文書内にある親レコードへのXMLコンポジット・オブジェクト・マッピングを示します。例62-41は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-42のXMLスキーマであると仮定して、図62-24では、対応するXML文書内にある要素へのXMLコンポジット・オブジェクト・マッピングを示します。例62-43は、Javaでのこのマッピングの構成方法を示しています。
例62-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を使用します。
例62-44のXMLスキーマであると仮定して、図62-25では、対応するXML文書内にある異なる要素への、名前によるXMLコンポジット・オブジェクト・マッピングを示します。例62-45は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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を使用します。
例62-46のXMLスキーマであると仮定して、図62-26では、対応するXML文書内の位置による、異なる要素へのXMLコンポジット・オブジェクト・マッピングを示します。例62-47は、Javaでのこのマッピングの構成方法を示しています。
例62-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>
例62-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など)を実装している必要があります。CompositeCollectionMappingクラスでは、マップされたクラスとそのクラスの索引付けタイプを参照できます。
例62-48のXMLスキーマであると仮定して、図62-27では、対応するXML文書内の位置による、異なる要素へのXMLコンポジット・コレクション・マッピングを示します。例62-49は、Collection属性に対するこのマッピングのJavaでの構成方法を示し、例62-50は、Map属性に対するこのマッピングのJavaでの構成方法を示しています。
例62-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>
例62-49 Collection属性に対するXMLコンポジット・コレクション・マッピングのJava
XMLCompositeCollectionMapping phoneNumbersMapping = new XMLCompositeCollectionMapping();
phoneNumbersMapping.setAttributeName("phoneNumbers");
phoneNumbersMapping.setXPath("phone-number");
phoneNumbersMapping.setReferenceClass(PhoneNumber.class);
例62-50 Map属性に対するXMLコンポジット・コレクション・マッピングのJava
XMLCompositeCollectionMapping phoneNumbersMapping = new XMLCompositeCollectionMapping();
phoneNumbersMapping.setAttributeName("phoneNumbers");
phoneNumbersMapping.setXPath("phone-number");
phoneNumbersMapping.setReferenceClass(PhoneNumber.class);
phoneNumbersMapping.useMapClass(HashMap.class, "getType");
詳細は、第67章「XMLコンポジット・コレクション・マッピングの構成」を参照してください。
XML任意オブジェクト・マッピングはコンポジット・オブジェクトXMLマッピングと類似しています(「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトがタイプany(Stringなど)である点が異なります。このタイプは、継承または共通インタフェースを介して他の特定のタイプと関連付ける必要はありません。
対応するオブジェクト属性値には、Descriptor、java.lang.Object、java.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。
このマッピングは、次のXMLスキーマ構成で使用できます。
any
choice
substitution groups
参照オブジェクトは、ディスクリプタでデフォルトのルート要素を指定できます(「デフォルトのルート要素」を参照)。
|
注意: 参照オブジェクトの未定義のドキュメント・ルート要素は、コレクション・マッピングおよびオブジェクト・マッピングによるマーシャリング中に無視されます。 |
例62-51のXMLスキーマであると仮定して、図62-28では、この例で使用されているJavaクラスを示します。単独のXML任意オブジェクト・マッピングを使用して、Customer属性contactMethodをマップしています。この属性は、あらゆる値(この例では、Address、PhoneNumber、Stringのインスタンス)を参照できる汎用性を持っている必要があります。
例62-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>
図62-29、図62-30および図62-31は、XML任意オブジェクト・マッピングが、例62-51のスキーマに準拠するXML文書のAddress、PhoneNumberおよびStringに(個々に)マッピングする方法を示しています。
例62-52は、Javaでのこのマッピングの構成方法を示しています。
例62-52 XML任意オブジェクト・マッピングのJava
XMLAnyObjectMapping contactMethodMapping = new XMLAnyObjectMapping();
contactMethodMapping.setAttributeName("contactMethod");
contactMethodMapping.setXPath("contact-method");
TopLink XMLマッピングでのxs:anyおよびxs:anyTypeのサポートの詳細は、「xs:anyとxs:anyTypeのサポート」を参照してください。
詳細は、第68章「XML任意オブジェクト・マッピングの構成」を参照してください。
XML任意コレクション・マッピングは、コンポジット・コレクションのXMLマッピングと類似しています(「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ(Stringなど)である点が異なります。このようなタイプは、継承または共通インタフェースを介して相互に関連付ける必要はありません。
対応するオブジェクト属性値には、Descriptor、java.lang.Object、java.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。
このマッピングは、次のXMLスキーマ構成で使用できます。
any
choice
substitution groups
各参照オブジェクト(Stringを除く)は、ディスクリプタでデフォルトのルート要素を指定する必要があります(「デフォルトのルート要素」を参照)。
例62-53のXMLスキーマであると仮定して、図62-32では、この例で使用されているJavaクラスを示します。単独のXML任意コレクション・マッピングを使用して、Customer属性contactMethodsをマップしています。この属性は、あらゆる値(この例では、Address、PhoneNumber、Stringのインスタンス)を参照できる汎用性を持っている必要があります。
例62-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>
図62-33は、XML任意コレクション・マッピングが、例62-53のスキーマに準拠するXML文書内のAddress、PhoneNumber、Stringの各オブジェクトのコレクションにマッピングする方法を示しています。
例62-54は、Javaでのこのマッピングの構成方法を示しています。
例62-54 XML任意コレクション・マッピングのJava
XMLAnyCollectionMapping contactMethodsMapping = new XMLAnyCollectionMapping();
contactMethodsMapping.setAttributeName("contactMethods");
contactMethodsMapping.setXPath("contact-methods");
TopLink XMLマッピングでのxs:anyおよびxs:anyTypeのサポートの詳細は、「xs:anyとxs:anyTypeのサポート」を参照してください。
詳細は、第69章「XML任意コレクション・マッピングの構成」を参照してください。
XMLトランスフォーメーション・マッピングを使用すると、カスタム・マッピングを作成できます。カスタム・マッピングでは、1つ以上のXMLノードを使用して、Javaクラスの属性に格納するオブジェクトを作成できます。マーシャリング(書込み)およびアンマーシャリング(読取り)時のカスタム要件を処理するため、トランスフォーメーション・マッピングではユーザー提供のoracle.toplink.mappings.transformersのインスタンス(AttributeTransformer、FieldTransformerなど)をとります。これは非介入型のソリューションであり、これによりドメイン・オブジェクトがこのために特別なインタフェースを実装する必要がなくなります。
図62-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テキスト・ノードにマップする役割を担います。
詳細は、第70章「XMLトランスフォーメーション・マッピングの構成」を参照してください。