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

戻る
戻る
 
次へ
次へ
 

53 EISマッピングの概要

TopLink企業情報システム(EIS)マッピングでは、J2EE Connector Architecture(J2C)アダプタを介した、レガシー・データ・ソースおよびエンタープライズ・アプリケーションへのアクセスをサポートします。TopLink EISマッピングでは、J2C Common Client Interface(CCI)を使用し、そのリソース・アダプタを介してEISにアクセスします。これにより、既存のJavaオブジェクト・モデルを直接トランザクション・データ・ソース(フラット・ファイル/階層データを持つメインフレームなど)にマップできるようになります。

EISマッピングでは、オブジェクトのデータ・メンバーをオブジェクトのディスクリプタで定義されたEISレコード形式に変換します。

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

EISマッピングのタイプ

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

表53-1 TopLinkのオブジェクトEISマッピングのタイプ

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

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


単純なオブジェクト属性を直接EISレコードにマップします。

基本

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

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


Java属性のコレクションを直接EISレコードにマップします。

基本

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

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


Javaオブジェクトを私有の1対1リレーションシップでEISレコードにマップします。コンポジット・オブジェクト・マッピングは、2つのクラス間のリレーションシップを表します。

詳細

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

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


JavaオブジェクトのMapまたはCollectionを私有の1対多リレーションシップでEISレコードにマップします。

詳細

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

「EISの1対1マッピング」


1つのソース・オブジェクトと1つのマップ済永続Javaオブジェクトの間のリレーションシップを表す、参照マッピングを定義します。

基本

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

「EISの1対多マッピング」


1つのソース・オブジェクトとマップ済永続Javaオブジェクトのコレクションの間のリレーションシップを表す、参照マッピングを定義します。

基本

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

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


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

詳細

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

EISマッピングの概念

この項では、次の内容を含む、TopLink EISマッピングに固有の概念について説明します。

EISレコード・タイプ

TopLinkでは、次のJ2C EISレコード・タイプをサポートします。

EISディスクリプタ・レベルでレコード・タイプを構成します(「レコード形式の構成」を参照)。EISマッピングでは、EISディスクリプタのレコード・タイプを使用して、Java属性をマップする方法を決定します。つまり、EISディスクリプタに様々なレコード・タイプを構成しながらも、同じEISマッピングを使用できます。


注意:

一部のJ2Cアダプタでは、一部のレコード・タイプがサポートされていません。詳細は、J2Cアダプタのドキュメントを参照してください。

索引付きレコード

javax.resource.cci.IndexedRecordは、java.util.Listインタフェースを使用して順序付けされたレコード要素のコレクションを表します。

TopLinkランタイムでは、使用するEISマッピングのタイプに応じて、索引付きレコードの要素か索引付きレコードのサブレコードに、Javaオブジェクトをマップします(「コンポジットおよび参照EISマッピング」を参照)。

マップ済レコード

javax.resource.cci.MappedRecordは、java.util.Mapインタフェースを使用してキー値にマップされたレコード要素のコレクションを表します。

TopLinkランタイムでは、使用するEISマッピングのタイプに応じて、マップ済レコードの要素かマップ済レコードのサブレコードに、Javaオブジェクトをマップします(「コンポジットおよび参照EISマッピング」を参照)。

XMLレコード

XMLレコードは、javax.resource.cci.Recordを、XMLスキーマ(XSD)ベースのXML文書として表したものです。一部のJ2Cアダプタでは、XMLレコードはサポートされていません。

TopLinkランタイムでは、XSDおよび、XMLマッピング用に定義された動作に基づいて、JavaオブジェクトをXMLドキュメントにマップします。

詳細は、「XMLマッピングの概要」を参照してください。

XPathのサポート

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

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

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

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

jaxb:classのサポート

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

  • all

  • sequence

  • choice

  • group

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

型保証列挙のサポート

EISDirectMappingJAXBTypesafeEnumConverterを使用して、またはXMLレコードにEISCompositeDirectCollectionMappingを使用して、Java属性を型保証列挙にマップできます。

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

コンポジットおよび参照EISマッピング

TopLinkでは、コンポジットおよび参照EISマッピングをサポートします。両方のマッピング・タイプにソースとターゲットのオブジェクトがありますが、TopLinkランタイムでは、ソース・オブジェクトとのインタラクションとターゲット・オブジェクトとのインタラクションは異なる方式で処理されます。この項ではその方式について説明します。

コンポジットEISマッピング

コンポジットEISマッピング(「EISコンポジット・ダイレクト・コレクション・マッピング」「EISコンポジット・オブジェクト・マッピング」および「EISコンポジット・コレクション・マッピング」)では、ソース・オブジェクトにはターゲット・オブジェクトが含まれています。

TopLinkでは、ターゲット(被所有)オブジェクト(または所有されているオブジェクト・コレクション)の属性をソース(所有)オブジェクトのレコードにサブレコードとして入れます。ターゲット・オブジェクトはルート・オブジェクト・タイプである必要はありません(「EISディスクリプタのタイプ(ルートまたはコンポジット)の構成」を参照)。インタラクションを定義する必要がないためです。

図53-1に、索引付きレコードを使用した、Customerクラスのインスタンスからの読取りインタラクションを示します。address属性用に定義されたコンポジット・オブジェクトEISマッピングのために、TopLinkでは、Customerレコード内にAddressサブレコードを作成します。

図53-1 EISコンポジット・マッピング

図53-1の説明が続きます
「図53-1 EISコンポジット・マッピング」の説明

参照EISマッピング

参照EISマッピング(「EISの1対1マッピング」および「EISの1対多マッピング」)では、ソース・オブジェクトには、ターゲット・オブジェクトへの外部キー(ポインタ)のみが含まれます。あるいは、ターゲット・オブジェクトに、ソース・オブジェクトへの外部キーが含まれています(キーはターゲット上にあります)。

TopLinkでは、ターゲット・オブジェクトの外部キーを単純値としてソース・オブジェクトのレコードに入れます。ソース・オブジェクトに対してインタラクションが実行されると、TopLinkでは、選択インタラクションを使用します。このインタラクションは、TopLinkディスクリプタに対して定義するもので、該当するターゲット・オブジェクト・インスタンスを取得して、ソース・オブジェクトのトランザクションでそのインスタンスに対するレコードを作成します。デフォルトでは、選択インタラクションは、ターゲット・オブジェクトに対する読取りインタラクションです。読取りインタラクションでは不十分な場合は、別個の選択インタラクションを定義できます(「選択インタラクションの構成」を参照)。ソースとターゲットの両方のオブジェクトがインタラクションを使用するため、ともにルート・オブジェクト・タイプである必要があります(「EISディスクリプタのタイプ(ルートまたはコンポジット)の構成」を参照)。

図53-2に、索引付きレコードを使用した、Orderクラスのインスタンスからの読取りインタラクションを示します。customer属性用に定義された1対1のEISマッピングのために、TopLinkでは、ターゲットのCustomerオブジェクトの外部キーを単純値としてOrderレコードに入れます。次に、TopLinkは、Orderディスクリプタに構成された選択インタラクションを使用して、該当するCustomerインスタンスを取得してOrderオブジェクトのトランザクションでそのインスタンスのレコードを作成します。

図53-2 EIS参照マッピング

図53-2の説明が続きます
「図53-2 EIS参照マッピング」の説明

EISマッピングのアーキテクチャ

図53-3は、次から構成される、TopLink EISマッピングのアーキテクチャの例を示しています。

  • JDBCデータベース・ゲートウェイ(Oracle Database 10gなど)

  • JDBCアダプタ

  • プロプラエタリのアダプタ(Oracle Interconnectなど)

  • J2C

図53-3 EISマッピングのアーキテクチャの例

図53-3の説明が続きます
「図53-3 EISマッピングのアーキテクチャの例」の説明

使用しているEISやインフラストラクチャによっては、これ以外のソリューションが最適となる場合もあります。

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

EISダイレクト・マッピングは、EISレコードに、そのディスクリプタのレコード・タイプに基づいて、単純なオブジェクト属性を直接マップします(表53-2を参照)。

表53-2 EISレコード・タイプ別EISダイレクト・マッピング

EISレコード・タイプ マッピング動作

索引付き

索引付きレコードのフィールドに直接マップします。

マップ済

マップ済レコードのフィールドに直接マップします。

XML

XMLレコードの属性またはテキスト・ノードに直接マップします。脚注1


脚注1 「XMLダイレクト・マッピング」も参照してください。

図53-4は、Orderクラスの属性orderedByorder要素内のXMLレコード属性ordered_byの間の直接EISダイレクト・マッピングを示しています。

図53-4 EISダイレクト・マッピング

図53-4の説明が続きます
「図53-4 EISダイレクト・マッピング」の説明

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

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

EISコンポジット・ダイレクト・コレクション・マッピングは、EISレコードに、そのディスクリプタのレコード・タイプに基づいて、Java属性のコレクションを直接マップします(表53-3を参照)。

表53-3 EISレコード・タイプ別EISコンポジット・ダイレクト・コレクション・マッピング

EISレコード・タイプ マッピング動作

索引付き

索引付きレコードのサブレコードに直接マップします。脚注1

マップ済

マップ済レコードのサブレコードに直接マップします。脚注1

XML

XMLレコードの属性またはテキスト・ノードに直接マップします。脚注2


脚注1 「コンポジットEISマッピング」も参照してください。

脚注2 「XMLコンポジット・ダイレクト・コレクション・マッピング」も参照してください。

図53-5は、Orderクラス属性itemsとXMLレコードの間のコンポジット・ダイレクト・コレクション・マッピングを示しています。Order属性itemsはコレクション・タイプ(Vectorなど)です。一連のitem要素を含むorder要素からなるXMLレコードにマップされます。

図53-5 EISコンポジット・ダイレクト・コレクション・マッピング

図53-5の説明が続きます
「図53-5 EISコンポジット・ダイレクト・コレクション・マッピング」の説明

詳細は、第56章「EISコンポジット・ダイレクト・コレクション・マッピングの構成」を参照してください。

EISコンポジット・オブジェクト・マッピング

EISコンポジット・オブジェクト・マッピングは、EISレコードのディスクリプタのレコード・タイプに基づいて、EISレコード内の私有された1対1のリレーションシップにJavaオブジェクトをマップします(表53-4を参照)。

表53-4 EISレコード・タイプ別EISコンポジット・オブジェクト・マッピング

EISレコード・タイプ マッピング動作

索引付き

索引付きレコードのサブレコードに直接マップします。脚注1

マップ済

マップ済レコードのサブレコードに直接マップします。脚注1

XML

XMLレコードの属性またはテキスト・ノードに直接マップします。脚注2


脚注1 「コンポジットEISマッピング」も参照してください。

脚注2 「XMLコンポジット・オブジェクト・マッピング」も参照してください。

図53-6は、Orderクラス属性addressとXMLレコードの間のコンポジット・オブジェクトEISマッピングを示しています。Order属性のaddressが、XMLレコードにマップされています。このXMLレコードは、address要素を含んだorder要素で構成されています。

図53-6 EISコンポジット・オブジェクト・マッピング

図53-6の説明が続きます
「図53-6 EISコンポジット・オブジェクト・マッピング」の説明

EISコンポジット・オブジェクト・マッピングは、変更ポリシーで使用することができます(「変更ポリシーの構成」を参照)。

詳細は、第57章「EISコンポジット・オブジェクト・マッピングの構成」を参照してください。

EISコンポジット・コレクション・マッピング

EISコンポジット・コレクション・マッピングは、Javaオブジェクトのコレクションを、EISレコードのディスクリプタのレコード・タイプに基づいて、EISレコード内で私有されている1対多のリレーションシップにマップします(表53-5参照)。コンポジット・コレクション・マッピングでは、TopLinkディスクリプタを持つ任意のクラスを参照できます。

表53-5 EISレコード・タイプ別EISコンポジット・コレクション・マッピング

EISレコード・タイプ マッピング動作

索引付き

索引付きレコードのサブレコードに直接マップします。脚注1

マップ済

マップ済レコードのサブレコードに直接マップします。脚注1

XML

XMLレコードの属性またはテキスト・ノードに直接マップします。脚注2


脚注1 「コンポジットEISマッピング」も参照してください。

脚注2 「XMLコンポジット・コレクション・マッピング」も参照してください。

図53-7は、Phoneクラス属性phoneNumbersとXMLレコードの間のコンポジット・コレクションEISマッピングを示しています。Employee属性のphoneNumbersが、XMLレコードにマップされています。このXMLレコードは、一連のPHONE_NUMBER要素を含んだEMPLOYEE要素で構成されています。

図53-7 EISコンポジット・コレクション・マッピング

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

詳細は、第58章「EISコンポジット・コレクション・マッピングの構成」を参照してください。

EISの1対1マッピング

EISの1対1マッピングは、1組のソース・オブジェクトとターゲット・オブジェクトの間のリレーションシップを表す参照マッピングです。ソース・オブジェクトは通常、ターゲット・オブジェクトに対する外部キー(ポインタ)を含んでいます(ソースにキーのある状態)。あるいは、ターゲット・オブジェクトにソース・オブジェクトに対する外部キーを含めることもできます(ターゲットにキーのある状態)。ソースとターゲットの両方のオブジェクトがインタラクションを使用するため、ともにルート・オブジェクト・タイプである必要があります(「ルートまたはコンポジット・タイプとしてのEISディスクリプタの構成」を参照)。

表53-6に、使用しているEISレコード・タイプ別に、このマッピングの動作をまとめます。

表53-6 EISレコード・タイプ別EIS 1対1マッピング

EISレコード・タイプ マッピング動作

索引付き

ターゲット・オブジェクト用に新規の索引付きレコードを作成します。脚注1

  • ソースにキーのある状態のユースケースでは、外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。

マップ済

ターゲット・オブジェクト用に新規のマップ済レコードを作成します。脚注1

  • ソースにキーのある状態のユースケースでは、外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。

XML

ターゲット・オブジェクト用に新規のXMLレコードが作成されます。

  • ソースにキーのある状態のユースケースでは、外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。


脚注1 「参照EISマッピング」も参照してください。

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

詳細は、第59章「EIS 1対1マッピングの構成」を参照してください。

ソースにキーのある状態でのEIS 1対1マッピング

図53-8に、ソースにキーのある状態での設計における、Employeeクラス属性projectと、XMLレコードを使用するProjectクラスとの間の、EIS 1対1マッピングを示します。

図53-8 ソースにキーのある状態でのEIS 1対1マッピング

図53-8の説明が続きます
「図53-8 ソースにキーのある状態でのEIS 1対1マッピング」の説明

Employeeオブジェクトに対する読取りインタラクションが実行されると、TopLinkではターゲットのProjectオブジェクトの主キーを1つの単純値としてEmployeeレコードに入れます。次に、TopLinkは、Employeeディスクリプタに構成された選択インタラクションを使用して、該当するProjectインスタンスを取得してEmployeeオブジェクトのトランザクションにそのインスタンスのレコードを作成します。この例では、Projectクラスの読取りインタラクションを選択インタラクションとして指定できます。

このマッピングを作成および構成する一般的な手順は、次のとおりです。

  1. Employeeproject属性に対して1対1 EISマッピングを作成します。

  2. 参照ディスクリプタをProjectとして構成します(「参照ディスクリプタの構成」を参照)。

  3. ソースとターゲットの外部キーを構成します(「外部キー・ペアの構成」を参照)。

    この例では次のとおりです。

    • ソースXMLフィールド: @project-id

    • ターゲットXMLフィールド: @id

  4. 選択インタラクションを構成します(「選択インタラクションの構成」を参照)。

    この例では、Projectクラスの読取りインタラクションを選択インタラクションとして指定できます。

例53-1で示したXSDの場合、ソースにキーのある状態においてEIS 1対1マッピングを構成する方法は、例53-2のようになります。この場合、ソース・オブジェクトにはターゲット・オブジェクトへの外部キー参照が含まれます。次の例では、ソース・オブジェクトはEmployee、ターゲット・オブジェクトはProjectです。ここでは、Employeeオブジェクトには、projectのidを使用して参照されるProjectがあります。

例53-1 ソースにキーのある状態でのEIS 1対1マッピングのXMLスキーマ

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xsd:element name="employee" type="employee-type"/>
    <xsd:element name="project" type="project-type"/>
    <xsd:complexType name="employee-type">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="project">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="project-id" type="xsd:integer"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="project-type">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:integer"/>
            <xsd:element name="leader" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

例53-2 ソースにキーのある状態でのEIS 1対1マッピング

// Employee descriptor
EISDescriptor descriptor = new EISDescriptor();
descriptor.setJavaClass(Employee.class);
descriptor.setDataTypeName("employee");
descriptor.setPrimaryKeyFieldName("name/text()");

EISOneToOneMapping projectMapping = new EISOneToOneMapping();
projectMapping.setReferenceClass(Project.class);
projectMapping.setAttributeName("project");
projectMapping.dontUseIndirection();
projectMapping.addForeignKeyFieldName("project/project-id/text()", "id/text()");

ターゲットにキーのある状態でのEIS 1対1マッピング

図53-9に、ターゲットにキーのある設計における、Employeeクラス属性projectと、XMLレコードを使用するProjectクラスとの間の、EIS 1対1マッピングを示します。やはりここでもEmployeeProject間の1対1のEISマッピングを構成しますが、この設計では、Project属性leaderには、Employeeオブジェクトの外部キーが含まれています。

図53-9 ターゲットにキーのある状態でのEIS 1対1マッピング

図53-9の説明が続きます
「図53-9 ターゲットにキーのある状態でのEIS 1対1マッピング」の説明

Employeeオブジェクトに対する読取りインタラクションが実行されると、TopLinkでは、Employeeディスクリプタに構成された選択インタラクションを使用し、該当するProjectインスタンスを取得して、Employeeオブジェクトのトランザクションでそのインスタンスのレコードを作成します。この例では、Projectクラスの読取りインタラクションは、それだけでは、予期されるニーズを満たせない可能性があるため、Project属性の(leaderではなく)Idに基づいて読取りを行うように実装されるものと想定されています。そのように実装する場合は、Employeeディスクリプタに対して別の選択インタラクションを定義する必要があります。このインタラクションでは、leaderがXであるProjectを検索します。ここでXとは、Employee属性のfirstNameの値です。

この構成では、Project属性のleaderは永続化されません。この属性を永続化するには、この属性からEmployee属性のfirstNameへの1対1のEISマッピングを構成する必要があります。

このマッピングを作成および構成する一般的な手順は、次のとおりです。

  1. Employeeproject属性に対して1対1 EISマッピングを作成します。

  2. 参照ディスクリプタをProjectとして構成します(「参照ディスクリプタの構成」を参照)。

  3. ソースとターゲットの外部キーを構成します(「外部キー・ペアの構成」を参照)。

    この例では次のとおりです。

    • ソースXMLフィールド: firstName/text()

    • ターゲットXMLフィールド: leader/text()

  4. 選択インタラクションを構成します(「選択インタラクションの構成」を参照)。

    この例では、Employeeディスクリプタに対して別の選択インタラクションを定義する必要があります。

例53-3で示したXSDの場合、ターゲットにキーのあるEIS 1対1マッピングを構成する方法は、例53-4のようになります。この場合、ターゲット・オブジェクトにはソース・オブジェクトへの外部キー参照が含まれます。次の例では、ソース・オブジェクトはEmployee、ターゲット・オブジェクトはProjectです。ここで、Projectは、従業員の名前でそのleaderを参照しています。

例53-3 ターゲットにキーのある状態でのEIS 1対1マッピングのXMLスキーマ

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xsd:element name="employee" type="employee-type"/>
    <xsd:element name="project" type="project-type"/>
    <xsd:complexType name="employee-type">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="project">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="project-id" type="xsd:integer"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="project-type">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:integer"/>
            <xsd:element name="leader" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    </xsd:schema>

例53-4 ターゲットにキーのある状態でのEIS 1対1マッピング

// Project descriptor
EISDescriptor descriptor = new EISDescriptor();
descriptor.setJavaClass(Project.class);
descriptor.setDataTypeName("project");
descriptor.setPrimaryKeyFieldName("id/text()");

EISOneToOneMapping leaderMapping = new EISOneToOneMapping();
leaderMapping.setReferenceClass(Employee.class);
leaderMapping.setAttributeName("leader");
leaderMapping.dontUseIndirection();
leaderMapping.addForeignKeyFieldName("leader/text()", "name/text()");

EISの1対多マッピング

EISの1対多マッピングは、1つのソース・オブジェクトと、ターゲット・オブジェクトのコレクションの間のリレーションシップを表す参照マッピングです。ソース・オブジェクトにターゲット・オブジェクトに対する外部キー(ポインタ)を含めるのが普通です(ソースにキーのある状態)が、このかわりに、ターゲット・オブジェクトにソース・オブジェクトに対する外部キーを含めることもできます(ターゲットにキーのある状態)。ソースとターゲットのオブジェクトはともにインタラクションを使用するため、これらのオブジェクトはすべてルート・オブジェクト・タイプである必要があります(「ルートまたはコンポジット・タイプとしてのEISディスクリプタの構成」を参照)。

表53-7に、使用しているEISレコード・タイプ別に、このマッピングの動作をまとめます。

表53-7 EISレコード・タイプ別EIS 1対多マッピング

EISレコード・タイプ マッピング動作

索引付き

各ターゲット・オブジェクト用に新規の索引付きレコードを作成します。脚注1

  • ソースにキーのある状態のユースケースでは、各ターゲット・オブジェクトへの外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。

マップ済

各ターゲット・オブジェクト用に新規のマップ済レコードを作成します。脚注1

  • ソースにキーのある状態のユースケースでは、外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。

XML

各ターゲット・オブジェクト用に新規のXMLレコードが作成されます。

  • ソースにキーのある状態のユースケースでは、各ターゲット・オブジェクトへの外部キーがソース・オブジェクトのレコードに追加されます。

  • ターゲットにキーのある状態のユースケースでは、外部キーがターゲット・オブジェクトのレコードに追加されます。


脚注1 「参照EISマッピング」も参照してください。

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

詳細は、第60章「EISの1対多マッピングの構成」を参照してください。

ソースにキーのある状態でのEIS 1対多マッピング

図53-10に、ソースにキーのある状態での設計における、Employeeクラス属性projectsと、XMLレコードを使用する複数のProjectクラス・インスタンスとの間の、EIS 1対多マッピングを示します。

図53-10 ソースにキーのある状態でのEIS 1対多マッピング

図53-10の説明が続きます
「図53-10 ソースにキーのある状態でのEIS 1対多マッピング」の説明

Employeeオブジェクトに対する読取りインタラクションが実行されると、TopLinkでは各ターゲットのProjectオブジェクトの外部キーをサブ要素としてEmployeeレコードに入れます。ソースおよびターゲットのXMLフィールドを1ペアのみ指定した場合は、デフォルトで各外部キーはEmployeeレコード内でグループ化されません。ソースおよびターゲットのXMLフィールドのペアを複数指定した場合は、グループ化要素を選択する必要があります(「参照ディスクリプタの構成」を参照)。図53-10に、グループ化要素ProjectのあるEmployeeレコードを示します。次に、TopLinkは、Employeeディスクリプタに構成された選択インタラクションを使用して、該当する各Projectインスタンスを取得してEmployeeオブジェクトのトランザクションにそれぞれのインスタンスのレコードを作成します。この例では、Projectクラスの読取りインタラクションを選択インタラクションとして指定できます。

このマッピングを作成および構成する一般的な手順は、次のとおりです。

  1. Employeeproject属性に対して1対多EISマッピングを作成します。

  2. 参照ディスクリプタをProjectとして構成します(「参照ディスクリプタの構成」を参照)。

  3. ソースとターゲットの外部キーを構成します(「外部キー・ペアの構成」を参照)。

    この例では次のとおりです。

    • ソースXMLフィールド: PROJECT

    • ターゲットXMLフィールド: @ID

  4. 選択インタラクションを構成します(「選択インタラクションの構成」を参照)。

    この例では、Projectクラスの読取りインタラクションを選択インタラクションとして指定できます。

例53-5で示したXSDの場合、ソースにキーのある状態においてEIS 1対多マッピングを構成する方法は、例53-6のようになります。この場合、ソース・オブジェクトにはターゲット・オブジェクトへの外部キー参照が含まれます。次の例では、ソース・オブジェクトはEmployee、ターゲット・オブジェクトはProjectです。ここで、Employeeオブジェクトには、Project idによって参照される1つ以上のProjectインスタンスがあります。

例53-5 ソースにキーのある状態でのEIS 1対多マッピングのXMLスキーマ

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xsd:element name="employee" type="employee-type"/>
    <xsd:element name="project" type="project-type"/>
    <xsd:complexType name="employee-type">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="projects">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="project-id"
                            type="xsd:integer" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="project-type">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:integer"/>
            <xsd:element name="leader" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

例53-6 ソースにキーのある状態でのEIS 1対多マッピング

// Employee descriptor
EISDescriptor descriptor = new EISDescriptor();
descriptor.setJavaClass(Employee.class);
descriptor.setDataTypeName("employee");
descriptor.setPrimaryKeyFieldName("name/text()");

EISOneToManyMapping projectMapping = new EISOneToManyMapping();
projectMapping.setReferenceClass(Project.class);
projectMapping.setAttributeName("projects");
projectMapping.setForeignKeyGroupingElement("projects"); projectMapping.setIsForeignKeyRelationship(true); projectMapping.dontUseIndirection();
projectMapping.addForeignKeyFieldName("project-id/text()", "id/text()");

ターゲットにキーのある状態でのEIS 1対多マッピング

図53-11に、ターゲットにキーのある設計における、Employeeクラス属性projectsと、XMLレコードを使用する複数のProjectクラス・インスタンスとの間の、EIS 1対多マッピングを示します。やはりここでもEmployeeProject間の1対1のEISマッピングを構成しますが、この設計では、Project属性leaderには、Employeeオブジェクトの外部キーが含まれています。

図53-11 ターゲットにキーのある状態でのEIS 1対多マッピング

図53-11の説明が続きます
「図53-11 ターゲットにキーのある状態でのEIS 1対多マッピング」の説明

Employeeオブジェクトに対する読取りインタラクションが実行されると、TopLinkでは、Employeeディスクリプタに構成された選択インタラクションを使用して、該当する各Projectインスタンスを取得して、Employeeオブジェクトのトランザクションでそれぞれのインスタンスのレコードを作成します。この例では、Projectクラスの読取りインタラクションは、それだけでは、予期されるニーズを満たせない可能性があるため、Project属性の(leaderではなく)Idに基づいて読取りを行うように実装されるものと想定されています。そのように実装する場合は、Employeeディスクリプタに対して別の選択インタラクションを定義する必要があります。このインタラクションでは、leaderがXであるProjectを検索します。ここでXとはJaneです。

この構成では、Project属性のleaderは永続化されません。この属性を永続化するには、この属性からEmployee属性のfirstNameへの1対1のEISマッピングを構成する必要があります。

このマッピングを作成および構成する一般的な手順は、次のとおりです。

  1. Employeeproject属性に対して1対1 EISマッピングを作成します。

  2. 参照ディスクリプタをProjectとして構成します(「参照ディスクリプタの構成」を参照)。

  3. ソースとターゲットの外部キーを構成します(「外部キー・ペアの構成」を参照)。

    この例では、「ソースにある外部キー」を選択して、ソースおよびターゲットのXMLフィールドのペアを1つ指定します。

    • ソースXMLフィールド:

    • ターゲットXMLフィールド:

  4. 選択インタラクションを構成します(「選択インタラクションの構成」を参照)。

    この例では、Employeeディスクリプタに対して別の選択インタラクションを定義する必要があります。

例53-7で示したXSDの場合、ターゲットにキーのある状態でのEIS 1対多マッピングを構成する方法は、例53-8のようになります。この場合、ターゲット・オブジェクトにはソース・オブジェクトへの外部キー参照が含まれます。次の例では、ソース・オブジェクトはEmployee、ターゲット・オブジェクトはProjectです。ここで、各Projectは、従業員の名前でそのleaderを参照しています。

例53-7 ターゲットにキーのある状態でのEIS 1対多マッピングのXMLスキーマ

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xsd:element name="employee" type="employee-type"/>
    <xsd:element name="project" type="project-type"/>
    <xsd:complexType name="employee-type">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="projects">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="project-id"
                                    type="xsd:integer" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="project-type">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:integer"/>
            <xsd:element name="leader" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

例53-8 ターゲットにキーのある状態でのEIS 1対多マッピング

// Project descriptor
EISDescriptor descriptor = new EISDescriptor();
descriptor.setJavaClass(Project.class);
descriptor.setDataTypeName("project");
descriptor.setPrimaryKeyFieldName("id/text()");

EISOneToManyMapping leaderMapping = new EISOneToOneMapping();
leaderMapping.setReferenceClass(Employee.class);
leaderMapping.setAttributeName("leader");
leaderMapping.dontUseIndirection();
leaderMapping.addForeignKeyFieldName("leader/text()", "name/text()");

EISトランスフォーメーション・マッピング

トランスフォーメーションEISマッピングでは、カスタム・マッピングを作成できます。カスタム・マッピングでは、EISレコード内の1つ以上のフィールドを使用して、Javaクラスの属性に格納するオブジェクトを作成できます。

表53-8に、使用しているEISレコード・タイプ別に、このマッピングの動作をまとめます。

表53-8 EISレコード・タイプ別EISトランスフォーメーション・マッピング

EISレコード・タイプ マッピング動作

索引付き

フィールド・トランスフォーマでは、索引付きレコードにデータを追加します(この索引付きレコードには属性トランスフォーマでアクセスできます)。

マップ済

フィールド・トランスフォーマでは、マップ済レコードにデータを追加します(このマップ済レコードには属性トランスフォーマでアクセスできます)。

XML

フィールド・トランスフォーマでは、XMLレコードにデータを追加します(このXMLレコードには属性トランスフォーマでアクセスできます)。


図53-12に示すように、oracle.toplink.mappings.transformers.AttributeTransformerインスタンスを使用してトランスフォーメーション・マッピングを構成し、アンマーシャリング時にXMLインスタンスからJava属性へのトランスフォーメーションを実行します。この例では、AttributeTransformerにより、2つのXMLテキスト・ノードを1つのJavaオブジェクトに統合しています。

図53-12 EISトランスフォーメーション・マッピング

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

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