ヘッダーをスキップ
Oracle TopLink開発者ガイド
10g(10.1.3.1.0)
B31861-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

62 XMLマッピングの概要

XMLマッピングは、オブジェクトのデータ・メンバーを、構造がXMLスキーマ・ドキュメント(XSD)により定義されているXML文書のXMLノードに変換します。

この章の内容は次のとおりです。

XMLマッピングのタイプ

TopLinkでは、表62-1に示すXMLマッピングをサポートしています。

表62-1 TopLinkのXMLへのマッピングのタイプ

マッピング・タイプ 説明 タイプ TopLink Workbench Java

「XMLダイレクト・マッピング」


単純なオブジェクト属性をXML属性またはテキスト・ノードにマップします。

基本

サポートされている
サポートされている

「XMLコンポジット・ダイレクト・コレクション・マッピング」


単純なオブジェクト属性のコレクションをXML属性またはテキスト・ノードにマップします。

基本

サポートされている
サポートされている

「XMLコンポジット・オブジェクト・マッピング」


シングル・オブジェクトを含む任意の属性をXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してその要素の内容を移入します。

基本

サポートされている
サポートされている

「XMLコンポジット・コレクション・マッピング」


オブジェクトの同種のコレクションを含む属性を、複数のXML要素にマップします。TopLinkランタイムでは、参照されたオブジェクトのディスクリプタを使用してそれらの要素の内容を移入します。

基本

サポートされている
サポートされている

「XML任意オブジェクト・マッピング」


任意オブジェクトのXMLマッピングは、コンポジット・オブジェクトのXMLマッピングと類似しています(「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ(Stringなど)である場合もあり、必ずしも継承や共通インタフェースを介して相互に関連付けられていない点が異なります。

詳細

サポートされている
サポートされている

「XML任意コレクション・マッピング」


任意コレクションのXMLマッピングは、コンポジット・コレクションのXMLマッピングと類似しています(「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ(Stringなど)である場合もあり、必ずしも継承や共通インタフェースを介して相互に関連付けられていない点が異なります。

詳細

サポートされている
サポートされている

「XMLトランスフォーメーション・マッピング」


カスタム・マッピングを作成し、1つ以上のXMLノードを使用してJavaクラスの属性に格納するオブジェクトを作成できるようにします。

詳細

サポートされている
サポートされている

XMLマッピングの概要

様々な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文書でデータを永続化します。

XPathのサポート

TopLinkでは、XPath文を使用して効率的にJavaオブジェクトの属性をXML文書の場所にマップします。XMLマッピングでのXPathの使用方法の詳細は、「マッピングとXPath」を参照してください。

xsd:listとxsd:unionのサポート

XMLダイレクト・マッピング(「XMLダイレクト・マッピング」を参照)およびコンポジット・ダイレクト・コレクション・マッピング(「XMLコンポジット・ダイレクト・コレクション・マッピング」を参照)を使用して、XML文書にxsd:listおよびxsd:unionタイプをマップできます。

詳細は、「マッピングとxsd:listおよびxsd:unionタイプ」を参照してください。

xs:anyとxs:anyTypeのサポート

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スキーマ定義

「XML任意オブジェクト・マッピング」を参照

xs:anyとして指定された単独の未指定複合型脚注1のある要素。

「XML任意コレクション・マッピング」を参照

xs:anyとして指定された複合型の未指定の順序脚注2のある要素。

タイプxs:anyTypeの複合型の指定の順序脚注2のある要素。

タイプxs:anyTypeのルート要素。


脚注1 minOccursmaxOccurs はともに1と等価です。

脚注2 maxOccursは1より大きな値です。

jaxb:classのサポート

XMLコンポジット・オブジェクト・マッピングを構成(「XMLコンポジット・オブジェクト・マッピング」を参照)して、次のXSD構造を使用してjaxb:classカスタマイズできます。

  • all

  • sequence

  • choice

  • group

詳細は、「マッピングとjaxb:classのカスタマイズ」を参照してください。

型保証列挙のサポート

XMLDirectMappingJAXBTypesafeEnumConverterを使用して、またはXML文書にXMLCompositeDirectCollectionMappingを使用して、Java属性を型保証列挙にマップできます。

詳細は、「マッピングおよびJAXB型保証列挙」を参照してください。

マッピングの拡張機能

既存のTopLink XMLマッピングがニーズを満たしていない場合、XMLマッピングの拡張機能(オブジェクト・タイプ、シリアライズ・オブジェクト、タイプ変換コンバータ、シンプル・タイプ・トランスレータなど)を使用してカスタムXMLマッピングを作成できます。詳細は、「マッピング・コンバータおよびトランスフォーマ」を参照してください。

XMLダイレクト・マッピング

XMLダイレクト・マッピングでは、XMLテキスト・ノードにJava属性を直接マップします。XMLダイレクト・マッピングは、次のような状況で使用できます。

詳細は、第64章「XMLダイレクト・マッピングの構成」を参照してください。


注意:

XMLダイレクト・マッピングと、リレーショナルのXMLタイプへ直接マッピングを混同しないでください(「XMLタイプへ直接マッピング」を参照)。

テキスト・ノードへのマッピング

この項では、次のような場合のXMLダイレクト・マッピングの使用方法について説明します。

単純なテキスト・ノードへのマッピング

例62-2のXMLスキーマであると仮定して、図62-1では、対応するXML文書内にある単純なテキスト・ノードへのXMLダイレクト・マッピングを示します。例62-3は、Javaでのこのマッピングの構成方法を示しています。

例62-2 単純なテキスト・ノードへのXMLダイレクト・マッピングのスキーマ

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="phone-number" type="xsd:string"/>
</xsd:schema>

図62-1 単純なテキスト・ノードへのXMLダイレクト・マッピング

図62-1の説明が続きます
「図62-1 単純なテキスト・ノードへのXMLダイレクト・マッピング」の説明

例62-3 単純なテキスト・ノードへのXMLダイレクト・マッピングのJava

XMLDirectMapping numberMapping = new XMLDirectMapping();
numberMapping.setAttributeName("number");
numberMapping.setXPath("text()");

単純な順序でのテキスト・ノードへのマッピング

例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-2 単純な順序でのテキスト・ノードへのXMLダイレクト・マッピング

図62-2の説明が続きます
「図62-2 単純な順序でのテキスト・ノードへのXMLダイレクト・マッピング」の説明

例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-3 サブ要素でのテキスト・ノードへのXMLダイレクト・マッピング

図62-3の説明が続きます
「図62-3 サブ要素でのテキスト・ノードへのXMLダイレクト・マッピング」の説明

例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-4 位置によるテキスト・ノードへのXMLダイレクト・マッピング

図62-4の説明が続きます
「図62-4 位置によるテキスト・ノードへのXMLダイレクト・マッピング」の説明

例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でのこのマッピングの構成方法を示しています。

例62-10 属性へのXMLダイレクト・マッピングのスキーマ

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="customer" type="customer-type"/>
    <xsd:complexType name="customer-type">
        <xsd:attribute name="id" type="xsd:integer"/>
    </xsd:complexType>
</xsd:schema>

図62-5 属性へのXMLダイレクト・マッピング

図62-5の説明が続きます
「図62-5 属性へのXMLダイレクト・マッピング」の説明

例62-11 属性へのXMLダイレクト・マッピングのJava

XMLDirectMapping idMapping = new XMLDirectMapping();
idMapping.setAttributeName("id");
idMapping.setXPath("@id");

指定のスキーマ・タイプへのマッピング

通常、TopLinkではXML文書のターゲット書式を決定できます。ただし、TopLinkで使用可能な複数のターゲットから、1つを指定する必要がある場合があります。たとえば、java.util.Calendarは、スキーマdatetimedateTimeのノードのいずれかにマーシャリングできる場合があり、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-6 指定のスキーマ・タイプへのXMLダイレクト・マッピング

図62-6の説明が続きます
「図62-6 指定のスキーマ・タイプへのXMLダイレクト・マッピング」の説明

例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);

XMLダイレクト・マッピングによるlistフィールドへのマッピング

例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-7 listフィールドへのXMLダイレクト・マッピング


例62-15 listフィールド・ノードへのXMLダイレクト・マッピングのJava

XMLDirectMapping tasksMapping = new XMLDirectMapping();
tasksMapping.setAttributeName("tasks");
XMLField myField = new XMLField("tasks/text()"); // pass in the XPath
myField.setUsesSingleNode(true);
tasksMapping.setField(myField);

XMLダイレクト・マッピングによるunionフィールドへのマッピング

例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-8 unionフィールドへのXMLダイレクト・マッピングのJavaクラス

図62-8の説明が続きます
「図62-8 unionフィールドへのXMLダイレクト・マッピングのJavaクラス」の説明

図62-9に、XML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例62-16のスキーマに準拠しています。TopLinkでXML文書をアンマーシャリングすると、変換が成功するまで各unionタイプが試行されます。unionの最初のスキーマ・タイプはxsd:decimalです。「10.5」が有効な小数であるため、TopLinkではその値を適切なタイプに変換します。Object属性が適切な値をトリガーできるほど詳細である場合、TopLinkではかわりにそのタイプを使用します。そうでない場合、TopLinkではデフォルト値(この場合はBigDecimal)を使用します。この動作はJavaコードでオーバーライドできます。

図62-9 最初の有効なunionタイプへのXMLダイレクト・マッピング

図62-9の説明が続きます
「図62-9 最初の有効なunionタイプへのXMLダイレクト・マッピング」の説明

図62-10に、別のXML文書のunionフィールドへのXMLダイレクト・マッピングを示します。このXML文書は例62-16のスキーマに準拠しています。このドキュメントでは値「M」は有効なxsd:decimalタイプではないため、次のunionタイプが試行されます。次のunionタイプはxsd:stringで、変換を実行できます。

図62-10 別の有効なunionタイプへのXMLダイレクト・マッピング

図62-10の説明が続きます
「図62-10 別の有効なunionタイプへのXMLダイレクト・マッピング」の説明

例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);

XMLダイレクト・マッピングによるunionOfListsマッピング

例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>

図62-11 unionOfLists XMLダイレクト・マッピング

図62-11の説明が続きます
「図62-11 unionOfLists XMLダイレクト・マッピング」の説明

この例では、有効なXML文書にすべてのxsd:double、すべてのxsd:dateまたはすべてのxsd:integerのいずれかの値が含まれていることに注意してください。

例62-19 unionOfLists XMLダイレクト・マッピングのJava

XMLDirectMapping mapping = new XMLDirectMapping();
mapping.setAttributeName("vacation");
mapping.setXPath("UnionOfLists/text()");

XMLダイレクト・マッピングによるunionOfUnionsマッピング

例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-12 unionOfUnions XMLダイレクト・マッピングのJavaクラス

図62-12の説明が続きます
「図62-12 unionOfUnions XMLダイレクト・マッピングのJavaクラス」の説明

例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コンポジット・ダイレクト・コレクション・マッピング

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-15 単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピング

図62-15の説明が続きます
「図62-15 単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピング」の説明

例62-25 単純な順序へのXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("tasks");
tasksMapping.setXPath("task/text()");

サブ要素の順序へのマッピング

例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-16 サブ要素の順序へのXMLコンポジット・ダイレクト・コレクション・マッピング

図62-16の説明が続きます
「図62-16 サブ要素の順序へのXMLコンポジット・ダイレクト・コレクション・マッピング」の説明

例62-27 サブ要素の順序へのXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("tasks");
tasksMapping.setXPath("tasks/task/text()");

複数の属性へのマッピング

例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-17 複数属性へのXMLコンポジット・ダイレクト・コレクション・マッピング

図62-17の説明が続きます
「図62-17 複数属性へのXMLコンポジット・ダイレクト・コレクション・マッピング」の説明

例62-29 複数属性へのXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("tasks/@task");
tasksMapping.setXPath("task/text()");

XMLコンポジット・ダイレクト・コレクション・マッピングによる単独テキスト・ノードへのマッピング

コレクションを単独ノードにマップする際、ノードの内容はスペースで区切られたリストとして扱われます。

例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-18 単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピング


例62-31 単独テキスト・ノードへのXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("tasks");
tasksMapping.setXPath("tasks/text()");
tasksMapping.setUsesSingleNode(true);

XMLコンポジット・ダイレクト・コレクション・マッピングによる単一属性へのマッピング

例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-19 単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピング

図62-19の説明が続きます
「図62-19 単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピング」の説明

例62-33 単一属性へのXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("tasks");
tasksMapping.setXPath("@tasks");
tasksMapping.setUsesSingleNode(true);

XMLコンポジット・ダイレクト・コレクション・マッピングによるlistOfUnionsマッピング

例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);

XMLコンポジット・ダイレクト・コレクション・マッピングによるunionOfListsマッピング

例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コンポジット・ダイレクト・コレクション・マッピング

図62-21の説明が続きます
「図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);

XMLコンポジット・ダイレクト・コレクション・マッピングによるコレクションのコンテンツ・タイプの指定

デフォルトでは、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コンポジット・ダイレクト・コレクション・マッピング

図62-22の説明が続きます
「図62-22 指定のコンテンツ・タイプによるXMLコンポジット・ダイレクト・コレクション・マッピング」の説明

例62-39 指定のコンテンツ・タイプによるXMLコンポジット・ダイレクト・コレクション・マッピングのJava

XMLCompositeDirectCollectionMapping tasksMapping = new XMLCompositeDirectCollectionMapping();
tasksMapping.setAttributeName("vacationDays");
tasksMapping.setXPath("vacation/text()");
tasksMapping.setAttributeElementClass(Calendar.class);

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-23 親レコードへのXMLコンポジット・オブジェクト・マッピング

図62-23の説明が続きます
「図62-23 親レコードへのXMLコンポジット・オブジェクト・マッピング」の説明

例62-41 親レコードへのXMLコンポジット・オブジェクト・マッピングのJava

XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
addressMapping.setAttributeName("address");
addressMapping.setXPath(".");
addressMapping.setReferenceClass(Address.class);

要素へのマッピング

例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>

図62-24 要素へのXMLコンポジット・オブジェクト・マッピング

図62-24の説明が続きます
「図62-24 要素へのXMLコンポジット・オブジェクト・マッピング」の説明

例62-43 要素へのXMLコンポジット・オブジェクト・マッピングのJava

XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
addressMapping.setAttributeName("address");
addressMapping.setXPath("address");
addressMapping.setReferenceClass(Address.class);

要素名による異なる要素へのマッピング

オブジェクトには、同じ参照クラスへの複数のコンポジット・オブジェクト・マッピングを設定できます。各コンポジット・オブジェクト・マッピングには一意の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-25 名前による要素へのXMLコンポジット・オブジェクト・マッピング

図62-25の説明が続きます
「図62-25 名前による要素へのXMLコンポジット・オブジェクト・マッピング」の説明

例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-26 位置による要素へのXMLコンポジット・オブジェクト・マッピング

図62-26の説明が続きます
「図62-26 位置による要素へのXMLコンポジット・オブジェクト・マッピング」の説明

例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コンポジット・コレクション・マッピング

XMLコンポジット・コレクション・マッピングは、1対多リレーションシップを表す場合に使用します。コンポジット・コレクションXMLマッピングでは、TopLinkディスクリプタを持つ任意のクラスを参照できます。マップされるオブジェクト内の属性は、Java Collectionインタフェース(VectorHashSetなど)またはMapインタフェース(HashtableTreeMapなど)を実装している必要があります。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-27 XMLコンポジット・コレクション・マッピング

図62-27の説明が続きます
「図62-27 XMLコンポジット・コレクション・マッピング」の説明

例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マッピングと類似しています(「XMLコンポジット・オブジェクト・マッピング」を参照)。ただし、参照オブジェクトがタイプany(Stringなど)である点が異なります。このタイプは、継承または共通インタフェースを介して他の特定のタイプと関連付ける必要はありません。

対応するオブジェクト属性値には、Descriptorjava.lang.Objectjava.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。

このマッピングは、次のXMLスキーマ構成で使用できます。

  • any

  • choice

  • substitution groups

参照オブジェクトは、ディスクリプタでデフォルトのルート要素を指定できます(「デフォルトのルート要素」を参照)。


注意:

参照オブジェクトの未定義のドキュメント・ルート要素は、コレクション・マッピングおよびオブジェクト・マッピングによるマーシャリング中に無視されます。

例62-51のXMLスキーマであると仮定して、図62-28では、この例で使用されているJavaクラスを示します。単独のXML任意オブジェクト・マッピングを使用して、Customer属性contactMethodをマップしています。この属性は、あらゆる値(この例では、AddressPhoneNumberStringのインスタンス)を参照できる汎用性を持っている必要があります。

例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-28 XML任意オブジェクト・マッピングのJavaクラス

図62-28の説明が続きます
「図62-28 XML任意オブジェクト・マッピングのJavaクラス」の説明

図62-29図62-30および図62-31は、XML任意オブジェクト・マッピングが、例62-51のスキーマに準拠するXML文書のAddressPhoneNumberおよびStringに(個々に)マッピングする方法を示しています。

図62-29 AddressタイプへのXML任意オブジェクト・マッピング

図62-29の説明が続きます
「図62-29 AddressタイプへのXML任意オブジェクト・マッピング」の説明

図62-30 PhoneNumberタイプへのXML任意オブジェクト・マッピング

図62-30の説明が続きます
「図62-30 PhoneNumberタイプへのXML任意オブジェクト・マッピング」の説明

図62-31 StringタイプへのXML任意オブジェクト・マッピング

図62-31の説明が続きます
「図62-31 StringタイプへのXML任意オブジェクト・マッピング」の説明

例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マッピングと類似しています(「XMLコンポジット・コレクション・マッピング」を参照)。ただし、参照オブジェクトが異なるタイプ(Stringなど)である点が異なります。このようなタイプは、継承または共通インタフェースを介して相互に関連付ける必要はありません。

対応するオブジェクト属性値には、Descriptorjava.lang.Objectjava.lang.String、プリミティブ・オブジェクト(java.lang.Integerなど)またはアプリケーションのあらゆる値に十分対応できるユーザー定義タイプのいずれかを持つ、任意のオブジェクトのインスタンスを使用できます。

このマッピングは、次のXMLスキーマ構成で使用できます。

  • any

  • choice

  • substitution groups

各参照オブジェクト(Stringを除く)は、ディスクリプタでデフォルトのルート要素を指定する必要があります(「デフォルトのルート要素」を参照)。

例62-53のXMLスキーマであると仮定して、図62-32では、この例で使用されているJavaクラスを示します。単独のXML任意コレクション・マッピングを使用して、Customer属性contactMethodsをマップしています。この属性は、あらゆる値(この例では、AddressPhoneNumberStringのインスタンス)を参照できる汎用性を持っている必要があります。

例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-32 XML任意コレクション・マッピングのJavaクラス

図62-32の説明が続きます
「図62-32 XML任意コレクション・マッピングのJavaクラス」の説明

図62-33は、XML任意コレクション・マッピングが、例62-53のスキーマに準拠するXML文書内のAddressPhoneNumberStringの各オブジェクトのコレクションにマッピングする方法を示しています。

図62-33 XML任意コレクション・マッピング

図62-33の説明が続きます
「図62-33 XML任意コレクション・マッピング」の説明

例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トランスフォーメーション・マッピング

XMLトランスフォーメーション・マッピングを使用すると、カスタム・マッピングを作成できます。カスタム・マッピングでは、1つ以上のXMLノードを使用して、Javaクラスの属性に格納するオブジェクトを作成できます。マーシャリング(書込み)およびアンマーシャリング(読取り)時のカスタム要件を処理するため、トランスフォーメーション・マッピングではユーザー提供のoracle.toplink.mappings.transformersのインスタンス(AttributeTransformerFieldTransformerなど)をとります。これは非介入型のソリューションであり、これによりドメイン・オブジェクトがこのために特別なインタフェースを実装する必要がなくなります。

図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テキスト・ノードにマップする役割を担います。

図62-34 XMLトランスフォーメーション・マッピング

図62-34の説明が続きます
「図62-34 XMLトランスフォーメーション・マッピング」の説明

詳細は、第70章「XMLトランスフォーメーション・マッピングの構成」を参照してください。