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トランスフォーメーション・マッピングの構成」を参照してください。