外部キー参照の実行

外部キー とは、別のビジネス・オブジェクトのキー値を含む 1 つのビジネス・オブジェクト内の属性です。

このキー値は、一部の他のビジネス・オブジェクトを識別するので、ソース・ビジネス・オブジェクトには「外部」と見なされます。ソース・ビジネス・オブジェクト内で外部キーを変換するには、外部キーが参照するビジネス・オブジェクトと関連する関係表 (外部関係表) にアクセスする必要があります。

この外部関係表から、宛先ビジネス・オブジェクトの外部キーに関連するキー値を取得できます。

マッピング API には、外部キー参照の実行のため表 109 に示すメソッドが用意されています。

表 109. 外部キー参照のための関数ブロック
関数ブロック 説明
General/APIs/Identity Relationship/Foreign Key Lookup 外部キー参照を実行し、外部キーが外部関係表に存在しない場合は、関係インスタンスの検出を失敗します。
General/APIs/Identity Relationship/Foreign Key Cross-Reference 外部キー参照を実行し、外部キーが存在しない場合は、外部関係表に新規の関係インスタンスを追加します。

Foreign Key Lookup 関数ブロックの使用

Foreign Key Lookup 関数ブロックに対応する Java コードは、外部関係表で、ソース・ビジネス・オブジェクトの外部キーを検索します。この関数ブロックは、以下のアクションを実行します。

  1. アプリケーション固有の参加者に、複合キーではなく、単一キーが含まれていることを検証します。

    アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Lookup 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。

  2. 汎用ビジネス・オブジェクト内の外部キーの値と一致する外部関係表内の関係インスタンスを検索します。
  3. 検索した関係インスタンスからアプリケーション固有のキー値を取得します。
  4. アプリケーション固有のキー値をアプリケーション固有のビジネス・オブジェクトの外部キーにコピーします。

Foreign Key Lookup 関数ブロックに対応する Java コードは、ソース・ビジネス・オブジェクトの動詞に関係なく、これらのアクションを外部関係表で実行します。

Foreign Key Cross-Reference 関数ブロックの使用

Foreign Key Lookup 関数ブロックと同様に、Foreign Key Cross-Reference 関数ブロックも、ソース・ビジネス・オブジェクトの外部キーに基づいて外部関係表で参照を実行します。ただし、Foreign Key Cross-Reference 関数ブロックには、参照が失敗した場合に関係表にエントリーを追加できるという追加の機能が備わっています。次以降のセクションでは、各呼び出しコンテキストでの Foreign Key Cross-Reference 関数ブロックの振る舞いについて説明します。

EVENT_DELIVERY、ACCESS_REQUEST、および SERVICE_CALL_RESPONSE 呼び出しコンテキスト

呼び出しコンテキストが EVENT_DELIVERYACCESS_REQUEST、または SERVICE_CALL_RESPONSE の場合、呼び出されるマップはインバウンド・マップです。つまり、アプリケーション固有のビジネス・オブジェクトが汎用ビジネス・オブジェクトに変換されます。インバウンド・マップはアプリケーション固有のビジネス・オブジェクトを入力として受け取り、汎用ビジネス・オブジェクトを出力として戻します。したがって、Foreign Key Cross-Reference 関数ブロックのタスクは、特定のアプリケーション固有のキー値に対応する汎用キーを、外部参照表から取得することです。

呼び出しコンテキストが EVENT_DELIVERYACCESS_REQUEST、または SERVICE_CALL_RESPONSE の場合、Foreign Key Cross-Reference 関数ブロックは以下のアクションを実行します。

  1. 汎用参加者に、複合キーではなく、単一キーが含まれていることを検証します。

    汎用ビジネス・オブジェクトである、汎用参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらの汎用キー属性のうちのどれに、アプリケーション固有のビジネス・オブジェクトの外部キーに対応する汎用キーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。

  2. アプリケーション固有のビジネス・オブジェクトの外部キー値と一致する関係インスタンスを外部関係表で検索します。表 110 に、Foreign Key Cross-Reference 関数ブロックがアプリケーション固有のビジネス・オブジェクトの動詞に基づいて外部関係表で実行するアクションを示します。
  3. 検索した関係インスタンスからインスタンス ID を取得します。
  4. インスタンス ID を汎用ビジネス・オブジェクトの外部キーにコピーします。

    表 110. EVENT_DELIVERY、ACCESS_REQUEST、および SERVICE_CALL_RESPONSE 呼び出しコンテキストのアクション
    アプリケーション固有のビジネス・オブジェクトの動詞 Foreign Key Cross-Reference 関数ブロックが実行するアクション
    Create EVENT_DELIVERYACCESS_REQUEST 呼び出しコンテキストの場合、アプリケーション固有のビジネス・オブジェクトのキー値について外部関係表に新規の関係エントリーを挿入します。

    SERVICE_CALL_RESPONSE 呼び出しコンテキストの場合、アプリケーション固有のビジネス・オブジェクトのキー値とその関連する関係インスタンスを含む新規の関係エントリーを関係表に挿入します。このメソッドは、マップの実行コンテキスト (cwExecCtx) 内のオリジナル要求ビジネス・オブジェクトから関係インスタンス ID を取得します。 SERVICE_CALL_RESPONSE の振る舞いの詳細については、"SERVICE_CALL_RESPONSE 呼び出しコンテキスト"を参照してください。


    このキー値のエントリーがすでに存在する場合は既存のエントリーを検索します。表にさらにエントリーを追加しないでください
    Update 指定されたアプリケーション固有のビジネス・オブジェクトの外部キー値の外部関係表から、関係エントリーを検索します。

    この外部キー値のエントリーが存在しない 場合は、アプリケーション固有のビジネス・オブジェクトの外部キー値の外部関係表に新規の関係エントリーを挿入します。
    Retrieve 指定されたアプリケーション固有のビジネス・オブジェクトの外部キー値の外部関係表から、関係エントリーを検索します。

呼び出しコンテキストが EVENT_DELIVERY ACCESS_REQUEST、または SERVICE_CALL_RESPONSE で、アプリケーション固有のビジネス・オブジェクト (App Obj A) の動詞が Create または Update である場合に、Foreign Key Cross-Reference 関数ブロックが外部関係表 (App Obj C 用) に対してどのようなアクセスを行うかを、図 135 に示します。

図 135. Create または Update 動詞についての外部キー参照


注:
Foreign Key Cross-Reference 関数ブロックが関係インスタンスを追加するのは、インバウンド・マップの外部関係表だけです。

SERVICE_CALL_REQUEST 呼び出しコンテキストと外部キー

呼び出しコンテキストが SERVICE_CALL_REQUEST の場合、呼び出されるマップはアウトバウンド・マップです。つまり、汎用ビジネス・オブジェクトがアプリケーション固有のビジネス・オブジェクトに変換されます。アウトバウンド・マップは汎用ビジネス・オブジェクトを入力として受け取り、アプリケーション固有のビジネス・オブジェクトを出力として戻します。呼び出しコンテキストが SERVICE_CALL_REQUEST の場合、Foreign Key Cross-Reference 関数ブロックは、以下のアクションを実行します。

  1. アプリケーション固有の参加者に、複合キーではなく、単一キーが含まれていることを検証します。

    アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。

  2. アプリケーション固有のビジネス・オブジェクトの動詞に基づいて、表 111 で説明するタスクが実行されます。

    Foreign Key Cross-Reference 関数ブロックは、動詞が Update、Delete、または Retrieve の場合に限り、特定の関係インスタンス ID に対応するアプリケーション固有のキー値を外部関係表から取得します。動詞が Create の場合、Foreign Key Cross-Reference 関数ブロックは、アプリケーション固有のキー値を取得しません

表 111 に、Foreign Key Cross-Reference 関数ブロックが汎用ビジネス・オブジェクトの動詞に基づいて外部関係表で実行するアクションを示します。

表 111. SERVICE_CALL_REQUEST 呼び出しコンテキストと外部キーのアクション
汎用ビジネス・オブジェクトの動詞 Foreign Key Cross-Reference 関数ブロックが実行するアクション
Create アクションは行いません。

呼び出しコンテキストが SERVICE_CALL_RESPONSE の場合、このメソッドで新規の関係インスタンスが外部関係表に書き込まれます。詳細については、"EVENT_DELIVERY、ACCESS_REQUEST、および SERVICE_CALL_RESPONSE 呼び出しコンテキスト"を参照してください。

Update、Delete、Retrieve
  1. マップの実行コンテキスト内のオリジナル要求ビジネス・オブジェクトから汎用ビジネス・オブジェクトのキー値 (関係インスタンス ID) を取得します。
  2. 指定された汎用ビジネス・オブジェクトのキー値の外部関係表から、関係インスタンスを検索します。このキー値の関係インスタンスが存在しない 場合は、RelationshipRuntimeException 例外がスローされます。動詞が Retrieve で参加者が検出されない場合、CxMissingIDException 例外がスローされます。
  3. 検索した関係インスタンスからアプリケーション固有のキー値を取得します。
  4. アプリケーション固有のキー値をアプリケーション固有のビジネス・オブジェクトにコピーします。

表 111 からわかるように、動詞が Create の場合、Foreign Key Cross-Reference 関数ブロックは、関係表に新規の関係インスタンスを書き込みません。インスタンス ID に対応するアプリケーション固有の外部キー値をまだ持っていないので、この書き込み操作は実行されません。コネクターがアプリケーション固有のビジネス・オブジェクトを処理する場合、新規の行の挿入 (複数行の場合もある) が必要なことがアプリケーションに通知されます。この挿入に成功すると、アプリケーションからコネクターに通知され、コネクターにより Create 動詞とアプリケーションのキー値を使用して該当するアプリケーション固有のビジネス・オブジェクトが作成されます。

注:
呼び出しコンテキストが SERVICE_CALL_REQUEST の場合、Foreign Key Cross-Reference 関数ブロックは、Maintain Simple Identity Relationship 関数ブロックが関係表を管理するときと同様の方法で、外部関係表を管理します。

ACCESS_RESPONSE 呼び出しコンテキストと外部キー

呼び出しコンテキストが ACCESS_RESPONSE の場合、呼び出されるマップはアウトバウンド・マップです。つまり、汎用ビジネス・オブジェクトがアプリケーション固有のビジネス・オブジェクトに変換されます。アウトバウンド・マップは汎用ビジネス・オブジェクトを入力として受け取り、アプリケーション固有のビジネス・オブジェクトを出力として戻します。したがって、Foreign Key Cross-Reference 関数ブロックのタスクは、特定の汎用キー値に対応するアプリケーション固有のキーを、外部参照表から取得することです。

呼び出しコンテキストが ACCESS_RESPONSE の場合、Foreign Key Cross-Reference 関数ブロックは、以下のアクションを実行します。

  1. アプリケーション固有の参加者に、複合キーではなく、単一キーが含まれていることを検証します。

    アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。

  2. 汎用ビジネス・オブジェクト内の外部キーの値と一致する外部関係表内の関係インスタンスを検索します。
  3. 検索した関係インスタンスからアプリケーション固有のキー値を取得します。
  4. アプリケーション固有のキー値をアプリケーション固有のビジネス・オブジェクトの外部キーにコピーします。

Foreign Key Cross-Reference 関数ブロックは、汎用ビジネス・オブジェクトの動詞に関係なく、これらのアクションを外部関係表で実行します。

Foreign Key Cross-Reference 関数ブロックと Foreign Key Lookup 関数ブロックの使用についてのヒント

Foreign Key Cross-Reference 関数ブロックや Foreign Key Lookup 関数ブロックを使用する場合は、以下のヒントに留意してください。

Copyright IBM Corp. 2004