TopLink企業情報システム(EIS)マッピングでは、Java EE Connector Architecture(JCA)アダプタを介した、レガシー・データ・ソースおよびエンタープライズ・アプリケーションへのアクセスをサポートします。TopLink EISマッピングでは、JCA Common Client Interface(CCI)を使用し、そのリソース・アダプタを介してEISにアクセスします。これにより、既存のJavaオブジェクト・モデルを直接トランザクション・データ・ソース(フラット・ファイル/階層データを持つメインフレームなど)にマップできるようになります。
EISマッピングでは、オブジェクトのデータ・メンバーをオブジェクトのディスクリプタで定義されたEISレコード形式に変換します。
この章の内容は次のとおりです。
複数のタイプのTopLinkマッピングに共通のマッピングの概念と機能の詳細は、第17章「マッピングの概要」を参照してください。
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オブジェクトの |
|||
1対1マッピング(77.7項「EISの1対1マッピング」を参照) |
1つのソース・オブジェクトと1つのマップ済永続Javaオブジェクトの間のリレーションシップを表す、参照マッピングを定義します。 |
|||
1対多マッピング(77.8項「EISの1対多マッピング」を参照) |
1つのソース・オブジェクトとマップ済永続Javaオブジェクトのコレクションの間のリレーションシップを表す、参照マッピングを定義します。 |
|||
トランスフォーメーション・マッピング(77.9項「EISトランスフォーメーション・マッピング」を参照) |
カスタム・マッピングを作成し、1つ以上のEISレコード・フィールドを使用してJavaクラスの属性に格納するオブジェクトを作成できるようにします。 |
この項では、次の内容を含む、TopLink EISマッピングに固有の概念について説明します。
TopLinkでは、次のJCA EISレコード・タイプをサポートします。
EISディスクリプタ・レベルでレコード・タイプを構成します(76.4項「レコード形式の構成」を参照)。EISマッピングでは、EISディスクリプタのレコード・タイプを使用して、Java属性をマップする方法を決定します。つまり、EISディスクリプタに様々なレコード・タイプを構成しながらも、同じEISマッピングを使用できます。
注意: 一部のJCAアダプタでは、一部のレコード・タイプがサポートされていません。詳細は、JCAアダプタのドキュメントを参照してください。 |
javax.resource.cci.IndexedRecord
は、java.util.List
インタフェースを使用して順序付けされたレコード要素のコレクションを表します。
TopLinkランタイムでは、使用するEISマッピングのタイプに応じて、索引付きレコードの要素か索引付きレコードのサブレコードに、Javaオブジェクトをマップします(77.2.6項「コンポジットおよび参照EISマッピング」を参照)。
javax.resource.cci.MappedRecord
は、java.util.Map
インタフェースを使用してキー値にマップされたレコード要素のコレクションを表します。
TopLinkランタイムでは、使用するEISマッピングのタイプに応じて、マップ済レコードの要素かマップ済レコードのサブレコードに、Javaオブジェクトをマップします(77.2.6項「コンポジットおよび参照EISマッピング」を参照)。
XMLレコードは、javax.resource.cci.Record
を、XMLスキーマ(XSD)ベースのXML文書として表したものです。一部のJCAアダプタでは、XMLレコードはサポートされていません。
TopLinkランタイムでは、XSDおよび、XMLマッピング用に定義された動作に基づいて、JavaオブジェクトをXMLドキュメントにマップします。
詳細は、第53章「XMLマッピングの概要」を参照してください。
XMLレコードを使用する際、TopLink EISマッピングでは、XPath文を使用して、Javaオブジェクトの属性をXMLレコード内の場所に効率的にマップします。XMLマッピングでのXPathの使用方法の詳細は、17.2.7項「マッピングおよびXPath」を参照してください。
XMLレコードを使用する際、EISダイレクト・マッピング(77.3項「EISダイレクト・マッピング」を参照)およびコンポジット・ダイレクト・コレクション・マッピング(77.4項「EISコンポジット・ダイレクト・コレクション・マッピング」を参照)を使用して、XMLレコード内にxsd:list
およびxsd:union
タイプをマップできます。
詳細は、17.2.8項「マッピングとxsd:listおよびxsd:unionタイプ」を参照してください。
XMLレコードを使用する際、EISコンポジット・オブジェクト・マッピングを構成(77.5項「EISコンポジット・オブジェクト・マッピング」を参照)して、次のXSD構造を使用してjaxb:class
をカスタマイズできます。
all
sequence
choice
group
詳細は、17.2.9項「マッピングとjaxb:classのカスタマイズ」を参照してください。
EISDirectMapping
にJAXBTypesafeEnumConverter
を使用して、またはXMLレコードにEISCompositeDirectCollectionMapping
を使用して、Java属性を型保証列挙にマップできます。
詳細は、17.2.10項「マッピングおよびJAXB型保証列挙」を参照してください。
TopLinkでは、コンポジットおよび参照EISマッピングをサポートします。両方のマッピング・タイプにソースとターゲットのオブジェクトがありますが、TopLinkランタイムでは、ソース・オブジェクトとのインタラクションとターゲット・オブジェクトとのインタラクションは異なる方式で処理されます。この項ではその方式について説明します。
コンポジットEISマッピング(77.4項「EISコンポジット・ダイレクト・コレクション・マッピング」、77.5項「EISコンポジット・オブジェクト・マッピング」および77.6項「EISコンポジット・コレクション・マッピング」)では、ソース・オブジェクトにはターゲット・オブジェクトが含まれています。
TopLinkでは、ターゲット(被所有)オブジェクト(または所有されているオブジェクト・コレクション)の属性をソース(所有)オブジェクトのレコードにサブレコードとして入れます。ターゲット・オブジェクトはルート・オブジェクト・タイプである必要はありません(76.6項「EISディスクリプタのタイプ(ルートまたはコンポジット)の構成」を参照)。インタラクションを定義する必要がないためです。
図77-1は、索引付きレコードを使用した、Customer
クラスのインスタンスからの読取りインタラクションを示します。address
属性用に定義されたコンポジット・オブジェクトEISマッピングのために、TopLinkでは、Customer
レコード内にAddress
サブレコードを作成します。
参照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-3は、次から構成される、TopLink EISマッピングのアーキテクチャの例を示します。
JDBCデータベース・ゲートウェイ(Oracle Database 10gなど)
JDBCアダプタ
プロプラエタリのアダプタ(Oracle Interconnectなど)
JCA
使用しているEISやインフラストラクチャによっては、これ以外のソリューションが最適となる場合もあります。
EISダイレクト・マッピングは、EISレコードに、そのディスクリプタのレコード・タイプに基づいて、単純なオブジェクト属性を直接マップします(表77-2を参照)。
表77-2 EISレコード・タイプ別EISダイレクト・マッピング
EISレコード・タイプ | マッピング動作 |
---|---|
索引付き |
索引付きレコードのフィールドに直接マップします。 |
マップ済 |
マップ済レコードのフィールドに直接マップします。 |
XML |
XMLレコードの属性またはテキスト・ノードに直接マップします。脚注1 |
脚注1 53.3項「XMLダイレクト・マッピング」も参照してください。
図77-4は、Order
クラスの属性orderedBy
とorder
要素内のXMLレコード属性ordered_by
の間のEISダイレクト・マッピングを示します。
詳細は、第79章「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レコードにマップされます。
詳細は、第80章「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
要素で構成されています。
EISコンポジット・オブジェクト・マッピングは、変更ポリシーで使用できます(119.30項「変更ポリシーの構成」を参照)。
詳細は、第81章「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
要素で構成されています。
詳細は、第82章「EISコンポジット・コレクション・マッピングの構成」を参照してください。
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-8は、ソースにキーのある状態での設計における、Employee
クラス属性project
と、XMLレコードを使用するProject
クラスとの間の、EIS 1対1マッピングを示します。
Employee
オブジェクトに対する読取りインタラクションが実行されると、TopLinkではターゲットのProject
オブジェクトの主キーを1つの単純値としてEmployee
レコードに入れます。次に、TopLinkは、Employee
ディスクリプタに構成された選択インタラクションを使用して、該当するProject
インスタンスを取得してEmployee
オブジェクトのトランザクションにそのインスタンスのレコードを作成します。この例では、Project
クラスの読取りインタラクションを選択インタラクションとして指定できます。
このマッピングを作成および構成する一般的な手順は、次のとおりです。
Employee
のproject
属性に対して1対1 EISマッピングを作成します。
参照ディスクリプタをProject
として構成します(78.3項「参照ディスクリプタの構成」を参照)。
ソースとターゲットの外部キーを構成します(83.2項「外部キー・ペアの構成」を参照)。
この例では次のとおりです。
ソースXMLフィールド: @project-id
ターゲットXMLフィールド: @id
選択インタラクションを構成します(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-9は、ターゲットにキーのある設計における、Employee
クラス属性project
と、XMLレコードを使用するProject
クラスとの間の、EIS 1対1マッピングを示します。やはりここでもEmployee
とProject
間の1対1のEISマッピングを構成しますが、この設計では、Project
属性leader
には、Employee
オブジェクトの外部キーが含まれています。
Employee
オブジェクトに対する読取りインタラクションが実行されると、TopLinkでは、Employee
ディスクリプタに構成された選択インタラクションを使用し、該当するProject
インスタンスを取得して、Employee
オブジェクトのトランザクションでそのインスタンスのレコードを作成します。この例では、Project
クラスの読取りインタラクションは、それだけでは、予期されるニーズを満たせない可能性があるため、Project
属性の(leader
ではなく)Id
に基づいて読取りを行うように実装されるものと想定されています。そのように実装する場合は、Employee
ディスクリプタに対して別の選択インタラクションを定義する必要があります。このインタラクションでは、leader
がXであるProject
を検索します。ここでXとは、Employee
属性のfirstName
の値です。
この構成では、Project
属性のleader
は永続化されません。この属性を永続化するには、この属性からEmployee
属性のfirstName
への1対1のEISマッピングを構成する必要があります。
このマッピングを作成および構成する一般的な手順は、次のとおりです。
Employee
のproject
属性に対して1対1 EISマッピングを作成します。
参照ディスクリプタをProject
として構成します(78.3項「参照ディスクリプタの構成」を参照)。
ソースとターゲットの外部キーを構成します(83.2項「外部キー・ペアの構成」を参照)。
この例では次のとおりです。
ソースXMLフィールド: firstName/text()
ターゲットXMLフィールド: leader/text()
選択インタラクションを構成します(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()");
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-10は、ソースにキーのある状態での設計における、Employee
クラス属性projects
と、XMLレコードを使用する複数のProject
クラス・インスタンスとの間の、EIS 1対多マッピングを示します。
Employee
オブジェクトに対する読取りインタラクションが実行されると、TopLinkでは各ターゲットのProject
オブジェクトの外部キーをサブ要素としてEmployee
レコードに入れます。ソースおよびターゲットのXMLフィールドを1ペアのみ指定した場合は、デフォルトで各外部キーはEmployee
レコード内でグループ化されません。ソースおよびターゲットのXMLフィールドのペアを複数指定した場合は、グループ化要素を選択する必要があります(78.3項「参照ディスクリプタの構成」を参照)。図77-10は、グループ化要素Project
のあるEmployee
レコードを示します。次に、TopLinkは、Employee
ディスクリプタに構成された選択インタラクションを使用して、該当する各Project
インスタンスを取得してEmployee
オブジェクトのトランザクションにそれぞれのインスタンスのレコードを作成します。この例では、Project
クラスの読取りインタラクションを選択インタラクションとして指定できます。
このマッピングを作成および構成する一般的な手順は、次のとおりです。
Employee
のproject
属性に対して1対多EISマッピングを作成します。
参照ディスクリプタをProject
として構成します(78.3項「参照ディスクリプタの構成」を参照)。
ソースとターゲットの外部キーを構成します(84.2項「外部キー・ペアの構成」を参照)。
この例では次のとおりです。
ソースXMLフィールド: PROJECT
ターゲットXMLフィールド: @ID
選択インタラクションを構成します(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-11は、ターゲットにキーのある設計における、Employee
クラス属性projects
と、XMLレコードを使用する複数のProject
クラス・インスタンスとの間の、EIS 1対多マッピングを示します。やはりここでもEmployee
とProject
間の1対1のEISマッピングを構成しますが、この設計では、Project
属性leader
には、Employee
オブジェクトの外部キーが含まれています。
Employee
オブジェクトに対する読取りインタラクションが実行されると、TopLinkでは、Employee
ディスクリプタに構成された選択インタラクションを使用して、該当する各Project
インスタンスを取得して、Employee
オブジェクトのトランザクションでそれぞれのインスタンスのレコードを作成します。この例では、Project
クラスの読取りインタラクションは、それだけでは、予期されるニーズを満たせない可能性があるため、Project
属性の(leader
ではなく)Id
に基づいて読取りを行うように実装されるものと想定されています。そのように実装する場合は、Employee
ディスクリプタに対して別の選択インタラクションを定義する必要があります。このインタラクションでは、leader
がXであるProject
を検索します。ここでXとはJaneです。
この構成では、Project
属性のleader
は永続化されません。この属性を永続化するには、この属性からEmployee
属性のfirstName
への1対1のEISマッピングを構成する必要があります。
このマッピングを作成および構成する一般的な手順は、次のとおりです。
Employee
のproject
属性に対して1対1 EISマッピングを作成します。
参照ディスクリプタをProject
として構成します(78.3項「参照ディスクリプタの構成」を参照)。
ソースとターゲットの外部キーを構成します(83.2項「外部キー・ペアの構成」を参照)。
この例では、「ソースにある外部キー」を選択して、ソースおよびターゲットのXMLフィールドのペアを1つ指定します。
ソースXMLフィールド:
ターゲットXMLフィールド:
選択インタラクションを構成します(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()");
トランスフォーメーション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オブジェクトに統合しています。
詳細は、第85章「EISトランスフォーメーション・マッピングの構成」を参照してください。