一致関係は、ビジネス・オブジェクトまたは他のデータ間に 1 対 1 の関連を設定します。複合一致関係では、複合キー属性で 2 つのビジネス・オブジェクトを関連付けします。
次のセクションで、複合一致関係を使用する手順を説明します。
一致関係定義は、参加者タイプがビジネス・オブジェクトであり data タイプでない ということが、参照関係定義と異なっています (参加者タイプ・リストでの最初の選択)。 単純一致関係の場合と同様に、次の特徴があります。
しかし、複合一致関係の場合、すべての参加者に関する参加者属性は複合キーです。この複合キーは、通常は親ビジネス・オブジェクトの固有キーと子ビジネス・オブジェクトの非固有キーで構成されます。
複合一致関係の関係定義を作成するには、次の手順を実行します。
ヒント: 親ビジネス・オブジェクトを展開して、キー属性を選択します。
ヒント: 親ビジネス・オブジェクトを展開して、親内の子属性を展開します。この子オブジェクトからキー属性を選択します。
制限: 複合関係を管理するために、サーバーは内部表を作成します。 表は関係の役割ごとに作成されます。 さらに、関係のすべてのキー属性 にわたってこれらの表に固有のインデックス が作成されます。(すなわち、関係のキー属性に対応する列はインデックスの参加者です。) 内部表の列サイズは、関係の属性と直接関連し、関係の MaxLength 属性の値によって決定されます。
通常、データベースでは作成可能なインデックスのサイズが制限されています。例えば、DB2 では、デフォルト・ページ・サイズの場合、インデックスは 1,024 バイトまでに制限されます。したがって、関係の MaxLength 属性および関係の属性数によっては、複合関係の作成中にインデックス・サイズの制限に達する場合があります。
要確認:
型 String の MaxLength 属性が指定されていない場合、SQLServer でのデフォルトは nvarchar(255) となります。したがって、関係に N 個のキーがあり、型がすべて String であり、デフォルトの MaxLength 属性が 255 バイトである場合は、インデックス・サイズは ((N*255)*2) + 16 バイトになります。このことから明らかなように、N >= 2 の値を取り、String のデフォルトの MaxLength 値が 255 バイトである場合は、SQLServer 7 の制限である 900 バイトを超えてしまいます。
複合一致関係の関係定義の作成方法の詳細については、"一致関係の定義"を参照してください。
表 100 が示しているのは、マッピング API
に用意されている、親ソース・ビジネス・オブジェクトの子属性から複合一致関係を保守するためのアクティビティー関数ブロックです。これらのメソッドが行うアクションは、ソース・オブジェクトの動詞と呼び出しコンテキストにより異なります。
関数ブロック | 説明 |
---|---|
General/APIs/Identity Relationship/
Maintain Child Verb | ソース子動詞を正しく設定します。 |
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 の参加者定義をサポートしません。これは次のようになります。
key attribute of A: ID key attribute of B: B[0].ID key attribute of C: B[0].C[0].ID
key attribute of A: ID key attribute of C: B[0].C[0].ID
孫オブジェクトにアクセスするために、これらのメソッドは次のように参加者定義のみサポートします。
key attribute of B: ID key attribute of C: C[0].ID
key attribute of B: ID first key attribute of C: C[0].ID1 second key attribute of C: C[0].ID2
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 つの子オブジェクトを一意的に識別せず、親オブジェクトのすべてのインスタンスの子オブジェクト間で子オブジェクトを識別するのも十分でありません。
このような子オブジェクトを一意的に識別するために、関係で複合キーが使用されます。複合キーでは、親キーにより親オブジェクトが一意的に識別されます。親キーと子キーの組み合わせにより、子オブジェクトが一意的に識別されます。親ビジネス・オブジェクトのマップ (メイン・マップ) で、子ビジネス・オブジェクトを含む属性にマッピング・コードを追加します。この属性の Activity Editor で、次の手順を実行して複合一致関係をコーディングします。
General/APIs/Identity Relationship/Maintain Child Verb 関数ブロックの最後の入力パラメーターは boolean 値フラグであり、子オブジェクトが複合関係に参加しているかどうかを示します。この子オブジェクトは単純一致関係でなく複合一致関係に参加しているので、maintainChildVerb() への最後の引き数として true を確実に渡します。 maintainChildVerb() を呼び出した後で サブマップを呼び出します。詳細については、"ソース子動詞の設定"を参照してください。
ヒント: Update My Children 関数ブロックを含む変換規則は、Maintain Composite Relationship 関数ブロックを含む変換規則の後に実行されるようにしてください。
次の例では、複合一致関係用にマップをカスタマイズする方法について説明します。
このカスタム・アクティビティーの目的は、maintainChildVerb() API
を使用して、子ビジネス・オブジェクトの動詞を、マップ実行コンテキストおよび親ビジネス・オブジェクトの動詞に基づいて設定することです。図 128 は、このカスタム・アクティビティーを示します。
このカスタム・アクティビティーの目的は、maintainComposite Relationship()
API を使用して、マップ内の複合一致関係を保守することです。図 129 は、このカスタム・アクティビティーを示します。
このカスタム・アクティビティーの目的は、updateMyChildren() API
を使用して、一致関係における指定の親/子関係の子インスタンスを追加または削除することです。図 130 は、このカスタム・アクティビティーを示します。
以下は、親マップの子属性のコーディング例です。このコード・フラグメントは、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() is called in the parent map.