複合一致関係の使用

一致関係は、ビジネス・オブジェクトまたは他のデータ間に 1 対 1 の関連を設定します。複合一致関係では、複合キー属性で 2 つのビジネス・オブジェクトを関連付けします。

次のセクションで、複合一致関係を使用する手順を説明します。

複合一致関係定義の作成

一致関係定義は、参加者タイプがビジネス・オブジェクトであり data タイプでない ということが、参照関係定義と異なっています (参加者タイプ・リストでの最初の選択)。 単純一致関係の場合と同様に、次の特徴があります。

しかし、複合一致関係の場合、すべての参加者に関する参加者属性は複合キーです。この複合キーは、通常は親ビジネス・オブジェクトの固有キーと子ビジネス・オブジェクトの非固有キーで構成されます。

複合一致関係定義の作成手順

複合一致関係の関係定義を作成するには、次の手順を実行します。

  1. 参加者タイプが親ビジネス・オブジェクトである参加者定義を作成します。
  2. 最初の参加者属性を親ビジネス・オブジェクトのキーに設定します。

    ヒント: 親ビジネス・オブジェクトを展開して、キー属性を選択します。

  3. 2 番目の参加者属性を子属性のキーに追加します。

    ヒント: 親ビジネス・オブジェクトを展開して、親内の子属性を展開します。この子オブジェクトからキー属性を選択します。

  4. 各参加者について、ステップ 1 から 3 を繰り返します。すべての複合一致関係の場合のように、この関係は汎用ビジネス・オブジェクトに関して 1 参加者と、アプリケーション固有のビジネス・オブジェクトに関して少なくとも 1 参加者を含みます。各参加者は、親ビジネス・オブジェクトのキーと (親ビジネス・オブジェクト内の属性の) 子ビジネス・オブジェクトのキーの、2 つの属性から構成されます。

制限: 複合関係を管理するために、サーバーは内部表を作成します。 表は関係の役割ごとに作成されます。 さらに、関係のすべてのキー属性 にわたってこれらの表に固有のインデックス が作成されます。(すなわち、関係のキー属性に対応する列はインデックスの参加者です。) 内部表の列サイズは、関係の属性と直接関連し、関係の MaxLength 属性の値によって決定されます。

通常、データベースでは作成可能なインデックスのサイズが制限されています。例えば、DB2 では、デフォルト・ページ・サイズの場合、インデックスは 1,024 バイトまでに制限されます。したがって、関係の MaxLength 属性および関係の属性数によっては、複合関係の作成中にインデックス・サイズの制限に達する場合があります。

要確認:

複合一致関係の関係定義の作成方法の詳細については、"一致関係の定義"を参照してください。

関係アクションの判別

表 100 が示しているのは、マッピング API に用意されている、親ソース・ビジネス・オブジェクトの子属性から複合一致関係を保守するためのアクティビティー関数ブロックです。これらのメソッドが行うアクションは、ソース・オブジェクトの動詞と呼び出しコンテキストにより異なります。

表 100. 子属性の複合一致関係の維持
関数ブロック 説明
General/APIs/Identity Relationship/
Maintain Child Verb
ソース子動詞を正しく設定します。
General/APIs/Identity Relationship/
Maintain Composite Relationship
関係表に適切なアクションを実行します。

General/APIs/Identity Relationship/Maintain Composite Relationship のアクション

Maintain Composite Relationship 関数ブロックは、マッピング APImaintainCompositeRelationship() を呼び出す Java コードを生成します。呼び出された API は、複合一致関係の関係表を管理します。このメソッドで、各関係インスタンス ID について関連するアプリケーション固有のキー値が関係インスタンスに確実に含まれるようになります。このメソッドは、複合一致関係の参加者および関係インスタンスの基本的な追加や削除のすべてを自動的に処理します。

maintainCompositeRelationship() が行うアクションは、ビジネス・オブジェクトの動詞の値と呼び出しコンテキストにより異なります。メソッドは指定された参加者の子オブジェクト間を繰り返し、各子オブジェクトで maintainSimpleIdentityRelationship() を呼び出して子のキー値を正しく設定します。maintainSimpleIdentityRelationship() の場合のように、maintainCompositeRelationship() が行うアクションは、次の情報により異なります。

maintainSimpleIdentityRelationship() が実行するアクションの詳細については、"一致関係表のアクセス"を参照してください。

maintainCompositeRelationship() メソッドは、2 つのネスト・レベルにのみ展開される複合キーのみ を処理します。つまりメソッドは、子オブジェクトの複合キーが祖父母オブジェクトの値に基づく場合は処理できません。

例: A がトップレベル・ビジネス・オブジェクト、A の子が B、B の子が C の場合、2 つのメソッドは子オブジェクト C の参加者定義をサポートしません。これは次のようになります。

孫オブジェクトにアクセスするために、これらのメソッドは次のように参加者定義のみサポートします。

General/APIs/Identity Relationship/Maintain Child Verb のアクション

Maintain Child Verb 関数ブロックは、マッピング APImaintainChildVerb() を呼び出す Java コードを生成します。呼び出された API は、宛先ビジネス・オブジェクトの子オブジェクトの動詞を保守します。またキー属性が複合一致関係の一部である子オブジェクトを処理することができます。複合関係の一部として maintainChildVerb() を呼び出す場合は、その最後のパラメーターの値が true であることを確認してください。このメソッドにより、親ソース・オブジェクトと呼び出しコンテキストに適切に動詞が設定されます。maintainChildVerb() のアクションの詳細については、"ソース子動詞の設定"を参照してください。

複合一致関係に関連するマップの規則のカスタマイズ

複合一致関係に関連する関係定義と参加者定義の作成が完了すると、複合一致関係を保守できるようにマップをカスタマイズすることができるようになります。複合一致関係では、複合キーが管理されます。したがって、このような関係の管理では、複合キーを構成する 2 つの部分の管理が必要になります。複合一致関係をコーディングするには、親ビジネス・オブジェクトと子ビジネス・オブジェクトの両方のマッピング変換規則をカスタマイズする必要があります (表 101 を参照)。

表 101. 複合一致関係関連のアクティビティー関数ブロック
関係するマップ 関係するビジネス・オブジェクト 属性 アクティビティー関数ブロック
メイン 親ビジネス・オブジェクト トップレベル・ビジネス・オブジェクト 「相互参照」変換規則を使用する。


子属性 (子ビジネス・オブジェクト) General/APIs/Identity Relationship/Maintain Composite
Relationship
General/APIs/Identity Relationship/Maintain Child Verb General/APIs/Identity Relationship/Update My Children
(オプション)
サブマップ 子ビジネス・
オブジェクト
キー属性 (非固有キー) 動詞に対して「移動」変換または「値を設定」変換を定義する。

子ビジネス・オブジェクトに非固有キー属性がある場合、複合一致関係でこれらの子ビジネス・オブジェクトを関連付けできます。

次のセクションで、この複合一致関係をカスタマイズする手順を説明します。

メイン・マップのカスタマイズ手順

親ビジネス・オブジェクトのマップ (メイン・マップ) で、親属性にマッピング・コードを追加します。

  1. 「移動」変換規則または「値を設定」変換規則を定義して、トップレベル・ビジネス・オブジェクトの動詞をマップする。
  2. トップレベル・ビジネス・オブジェクトどうしの間に「相互参照」変換を定義する。
  3. 子属性に対してカスタム変換を定義し、Activity Editor で General/APIs/Identity Relationship/Maintain Composite Relationship 関数ブロックを追加する。

子属性のコーディング手順

親オブジェクトの子属性には、子ビジネス・オブジェクトが含まれています。子オブジェクトは、通常は複数カーディナリティーのビジネス・オブジェクトです。またキー属性を含み、その値で子が識別されます。しかし、このキー値は固有である必要はありません。したがって、同じ親の子オブジェクト間で 1 つの子オブジェクトを一意的に識別せず、親オブジェクトのすべてのインスタンスの子オブジェクト間で子オブジェクトを識別するのも十分でありません。

このような子オブジェクトを一意的に識別するために、関係で複合キーが使用されます。複合キーでは、親キーにより親オブジェクトが一意的に識別されます。親キーと子キーの組み合わせにより、子オブジェクトが一意的に識別されます。親ビジネス・オブジェクトのマップ (メイン・マップ) で、子ビジネス・オブジェクトを含む属性にマッピング・コードを追加します。この属性の Activity Editor で、次の手順を実行して複合一致関係をコーディングします。

  1. メイン・マップの子ビジネス・オブジェクト属性に対して「サブマップ」変換を定義します。通常、子オブジェクトのマッピング変換はサブマップ内で行われます。特に子オブジェクトが複数カーディナリティーの場合はサブマップ内で行われます。
  2. メイン・マップで子動詞に対してカスタム変換規則を定義し、General/APIs/Identity Relationship/Maintain Child Verb 関数ブロックを追加して、子ビジネス・オブジェクトの動詞を保守できるようにします。

    General/APIs/Identity Relationship/Maintain Child Verb 関数ブロックの最後の入力パラメーターは boolean 値フラグであり、子オブジェクトが複合関係に参加しているかどうかを示します。この子オブジェクトは単純一致関係でなく複合一致関係に参加しているので、maintainChildVerb() への最後の引き数として true を確実に渡します。 maintainChildVerb() を呼び出した後で サブマップを呼び出します。詳細については、"ソース子動詞の設定"を参照してください。

  3. 親ソース・オブジェクトの複合キーを保守できるようにするため、マッピング規則をカスタマイズして General/APIs/Identity Relationship/Maintain Composite Relationship 関数ブロックを追加します。
  4. 親オブジェクトの動詞が Update でその理由が子オブジェクトの削除である場合に関係表を保守できるようにするため、マッピング規則をカスタマイズして General/APIs/Identity Relationship/Update My Children 関数ブロックを追加します。

    ヒント: Update My Children 関数ブロックを含む変換規則は、Maintain Composite Relationship 関数ブロックを含む変換規則の後に実行されるようにしてください。

複合一致関係に関連するマップのカスタマイズの例

次の例では、複合一致関係用にマップをカスタマイズする方法について説明します。

  1. メイン・マップで、子ビジネス・オブジェクトの動詞の間にカスタム変換規則を定義します。カスタマイズされたアクティビティーで General/APIs/Identity Relationship/Maintain Child Verb 関数ブロックを使用して、子ビジネス・オブジェクトの動詞を保守します。

    このカスタム・アクティビティーの目的は、maintainChildVerb() API を使用して、子ビジネス・オブジェクトの動詞を、マップ実行コンテキストおよび親ビジネス・オブジェクトの動詞に基づいて設定することです。図 128 は、このカスタム・アクティビティーを示します。

    図 128. Maintain Child Verb の関数ブロックの使用

  2. 必要な場合は、子レベルで必要なマッピングを実行するように子ビジネス・オブジェクト間のサブマップ変換規則を定義します。
  3. トップレベル・ビジネス・オブジェクトどうしの間にカスタム変換規則を定義します。カスタマイズされたアクティビティーで General/APIs/Identity Relationship/Maintain Composite Relationship 関数ブロックを使用して、このマップの複合一致関係を保守します。

    このカスタム・アクティビティーの目的は、maintainComposite Relationship() API を使用して、マップ内の複合一致関係を保守することです。図 129 は、このカスタム・アクティビティーを示します。

    図 129. 複合関係の保守のための関数ブロックの使用

  4. ソースのトップレベル・ビジネス・オブジェクトから宛先の子ビジネス・オブジェクト属性へのカスタム変換規則マッピングを定義します。カスタマイズされたアクティビティーで General/APIs/Identity Relationship/Update My Children 関数ブロックを使用して、関係の子インスタンスを保守します。

    このカスタム・アクティビティーの目的は、updateMyChildren() API を使用して、一致関係における指定の親/子関係の子インスタンスを追加または削除することです。図 130 は、このカスタム・アクティビティーを示します。

    図 130. Update My Children の関数ブロックの使用

子属性のコーディングの例

以下は、親マップの子属性のコーディング例です。このコード・フラグメントは、SAP Order ビジネス・オブジェクトの Order Line Item 属性に存在します。ここでは maintainChildVerb() を使用して子オブジェクト動詞を設定し、その後 Order line Item 子オブジェクトのマッピングを処理するために for ループ内でサブマップ (Sub_SaOrderLieItem_to_CwOrderLineItem) を呼び出します。

{
 BusObjArray srcCollection_For_ObjSAP_Order_SAP_OrderLineItem =
    ObjSAP_Order.getBusObjArray("SAP_OrderLineItem");
  
 //
 // LOOP ONLY ON NON-EMPTY ARRAYS
 // -----------------------------
 //
 // Perform the loop only if the source array is non-empty.
 //
 if ((srcCollection_For_ObjSAP_Order_SAP_OrderLineItem != null) &&
       (srcCollection_For_ObjSAP_Order_SAP_OrderLineItem.size() > 0))
    {
    int currentBusObjIndex_For_ObjSAP_Order_SAP_OrderLineItem;
    int lastInputIndex_For_ObjSAP_Order_SAP_OrderLineItem =
    srcCollection_For_ObjSAP_Order_SAP_OrderLineItem.getLastIndex();
  
    // ----
    IdentityRelationship.maintainChildVerb(
       "OrdrLine",
       "SAPOrln",
       "CWOrln",
       ObjSAP_Order,
       "SAP_OrderLineItem",
       ObjOrder,
       "OrderLineItem",
       cwExecCtx,
       true,
       true);
  
    // ----
    for (currentBusObjIndex_For_ObjSAP_Order_SAP_
          OrderLineItem = 0;
          currentBusObjIndex_For_ObjSAP_Order_SAP_OrderLineItem <=
             lastInputIndex_For_ObjSAP_Order_SAP_OrderLineItem;
          currentBusObjIndex_For_ObjSAP_Order_SAP_OrderLineItem++)
       {
       BusObj currentBusObj_For_ObjSAP_Order_SAP_OrderLineItem =
 (BusObj) (srcCollection_For_ObjSAP_Order_SAP_OrderLineItem.elementAt(
             currentBusObjIndex_For_ObjSAP_Order_SAP_OrderLineItem));
  
       //
       // INVOKE MAP ON VALID OBJECTS
       // ---------------------------
       //
       // Invoke the map only on those children objects that meet
       // certain criteria.
       //
       if (currentBusObj_For_ObjSAP_Order_SAP_OrderLineItem != null)
          {
          BusObj[] _cw_inObjs = new BusObj[2];
          _cw_inObjs[0] =
                currentBusObj_For_ObjSAP_Order_SAP_OrderLineItem;
          _cw_inObjs[1] = ObjSAP_Order;
          logInfo ("*** Inside SAPCW header, verb is: " +
             (_cw_inObjs[0].getVerb()));
  
          try
             {
             BusObj[] _cw_outObjs = DtpMapService.runMap(
                "Sub_SaOrderLineItem_to_CwOrderLineItem",
                "CwMap",
                _cw_inObjs,
                cwExecCtx);
             _cw_outObjs[0].setVerb(_cw_inObjs[0].getVerb());
             ObjOrder.setWithCreate("OrderLineItem", _cw_outObjs[0]);
             }
  
          catch (MapNotFoundException me) 
             {
             logError(5502,
                " Sub_SaOrderLineItem_to_CwOrderLineItem ");
             throw new MapFailureException ("Submap not found");
             }
          }
       }
  
    // Start of the child relationship code
    BusObjArray temp = (BusObjArray)ObjOrder.get("OrderLineItem");
    try
       {
       IdentityRelationship.maintainCompositeRelationship(
          "OrdrLine",
          "SAPOrln",
          ObjSAP_Order,
          temp,
          cwExecCtx);
       }
  
    catch RelationshipRuntimeException re
       { 
       logError(re.toString());
       }
  
    // This call to updateMyChildren() assumes the existence of the
    // OrdrOrln parent/child relationship between the SAP_Order
    // (parent) and SAP_OrderItem (child)
    IdentityRelationship.updateMyChildren(
       "OrdrOrln",
       "SAOrders",
       ObjSAP_Order,
       "SAOrdrLn",
       "LineItem",
       "OrdrLine",
       "SAPOrln",
       cwExecCtx);
  
    // End of the child relationship code
    }
 }
 

サブマップのカスタマイズ

子ビジネス・オブジェクトのマップ (サブマップ) で、マッピング・コードを子オブジェクトのキー属性に追加します。追加する必要のある唯一のコードは、子オブジェクトの動詞を親オブジェクトの動詞に設定する setVerb() メソッドの呼び出しです。 詳細については、"宛先ビジネス・オブジェクトの動詞の設定"を参照してください。

注:
子オブジェクトの基本キーで maintainCompositeRelationship() メソッドが必要な場合は、親マップ内の、サブマップを呼び出す for ループの最後のすぐ後で呼び出します。サブマップでは、宛先オブジェクトの基本キーのコードに、次の行が組み込まれている必要があります。
// maintainCompositeRelationship() 
 is called in the parent map.
 

Copyright IBM Corp. 2004