ヘッダーをスキップ
Oracle Fusion Middleware Oracle TopLink開発者ガイド
11gリリース1(11.1.1)
B56246-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

77 EISマッピングの概要

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

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

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

複数のタイプのTopLinkマッピングに共通のマッピングの概念と機能の詳細は、第17章「マッピングの概要」を参照してください。

77.1 EISマッピングのタイプ

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

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

EISマッピングのタイプ 説明 Oracle JDeveloper
TopLink Workbench Java

ダイレクト・マッピング(77.3項「EISダイレクト・マッピング」を参照)

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

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

コンポジット・ダイレクト・コレクション・マッピング(77.4項「EISコンポジット・ダイレクト・コレクション・マッピング」を参照)

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

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

コンポジット・オブジェクト・マッピング(77.5項「EISコンポジット・オブジェクト・マッピング」を参照)

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

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

コンポジット・コレクション・マッピング(77.6項「EISコンポジット・コレクション・マッピング」を参照)

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

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

1対1マッピング(77.7項「EISの1対1マッピング」を参照)

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

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

1対多マッピング(77.8項「EISの1対多マッピング」を参照)

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

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

トランスフォーメーション・マッピング(77.9項「EISトランスフォーメーション・マッピング」を参照)

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

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

77.2 EISマッピングの概念

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

77.2.1 EISレコード・タイプ

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

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


注意:

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

77.2.1.1 索引付きレコード

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

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

77.2.1.2 マップ済レコード

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

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

77.2.1.3 XMLレコード

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

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

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

77.2.2 XPathのサポート

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

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

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

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

77.2.4 jaxb:classのサポート

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

  • all

  • sequence

  • choice

  • group

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

77.2.5 型保証列挙のサポート

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

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

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

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

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

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

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

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

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

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

77.2.6.2 参照EISマッピング

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

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

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

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

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

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

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

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

  • JDBCアダプタ

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

  • JCA

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

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

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

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

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

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

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

索引付き

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

マップ済

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

XML

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


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

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

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

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

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

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

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

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

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

索引付き

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

マップ済

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

XML

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


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

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

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

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

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

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

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

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

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

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

索引付き

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

マップ済

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

XML

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


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

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

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

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

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

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

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

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

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

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

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

索引付き

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

マップ済

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

XML

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


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

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

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

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

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

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

77.7 EISの1対1マッピング

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

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

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

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

索引付き

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

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

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

マップ済

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

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

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

XML

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

例77-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()");

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

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

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

図77-9の説明が続きます
「図77-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として構成します(78.3項「参照ディスクリプタの構成」を参照)。

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

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

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

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

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

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

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

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

例77-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()");

77.8 EISの1対多マッピング

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

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

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

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

索引付き

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

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

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

マップ済

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

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

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

XML

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

例77-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()");

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

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

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

図77-11の説明が続きます
「図77-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として構成します(78.3項「参照ディスクリプタの構成」を参照)。

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

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

    • ソースXMLフィールド:

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

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

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

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

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

例77-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()");

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

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

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

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

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

索引付き

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

マップ済

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

XML

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


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

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

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

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