外部キー とは、別のビジネス・オブジェクトのキー値を含む 1 つのビジネス・オブジェクト内の属性です。
このキー値は、一部の他のビジネス・オブジェクトを識別するので、ソース・ビジネス・オブジェクトには「外部」と見なされます。ソース・ビジネス・オブジェクト内で外部キーを変換するには、外部キーが参照するビジネス・オブジェクトと関連する関係表 (外部関係表) にアクセスする必要があります。
この外部関係表から、宛先ビジネス・オブジェクトの外部キーに関連するキー値を取得できます。
マッピング API には、外部キー参照の実行のため表 109 に示すメソッドが用意されています。
関数ブロック | 説明 |
---|---|
General/APIs/Identity Relationship/Foreign Key Lookup | 外部キー参照を実行し、外部キーが外部関係表に存在しない場合は、関係インスタンスの検出を失敗します。 |
General/APIs/Identity Relationship/Foreign Key Cross-Reference | 外部キー参照を実行し、外部キーが存在しない場合は、外部関係表に新規の関係インスタンスを追加します。 |
Foreign Key Lookup 関数ブロックに対応する Java コードは、外部関係表で、ソース・ビジネス・オブジェクトの外部キーを検索します。この関数ブロックは、以下のアクションを実行します。
アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Lookup 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。
Foreign Key Lookup 関数ブロックに対応する Java コードは、ソース・ビジネス・オブジェクトの動詞に関係なく、これらのアクションを外部関係表で実行します。
Foreign Key Lookup 関数ブロックと同様に、Foreign Key Cross-Reference 関数ブロックも、ソース・ビジネス・オブジェクトの外部キーに基づいて外部関係表で参照を実行します。ただし、Foreign Key Cross-Reference 関数ブロックには、参照が失敗した場合に関係表にエントリーを追加できるという追加の機能が備わっています。次以降のセクションでは、各呼び出しコンテキストでの Foreign Key Cross-Reference 関数ブロックの振る舞いについて説明します。
呼び出しコンテキストが EVENT_DELIVERY、ACCESS_REQUEST、または SERVICE_CALL_RESPONSE の場合、呼び出されるマップはインバウンド・マップです。つまり、アプリケーション固有のビジネス・オブジェクトが汎用ビジネス・オブジェクトに変換されます。インバウンド・マップはアプリケーション固有のビジネス・オブジェクトを入力として受け取り、汎用ビジネス・オブジェクトを出力として戻します。したがって、Foreign Key Cross-Reference 関数ブロックのタスクは、特定のアプリケーション固有のキー値に対応する汎用キーを、外部参照表から取得することです。
呼び出しコンテキストが EVENT_DELIVERY、ACCESS_REQUEST、または SERVICE_CALL_RESPONSE の場合、Foreign Key Cross-Reference 関数ブロックは以下のアクションを実行します。
汎用ビジネス・オブジェクトである、汎用参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらの汎用キー属性のうちのどれに、アプリケーション固有のビジネス・オブジェクトの外部キーに対応する汎用キーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。
表 110. EVENT_DELIVERY、ACCESS_REQUEST、および SERVICE_CALL_RESPONSE 呼び出しコンテキストのアクション
アプリケーション固有のビジネス・オブジェクトの動詞 | Foreign Key Cross-Reference 関数ブロックが実行するアクション |
---|---|
Create | EVENT_DELIVERY と ACCESS_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 動詞についての外部キー参照
呼び出しコンテキストが SERVICE_CALL_REQUEST の場合、呼び出されるマップはアウトバウンド・マップです。つまり、汎用ビジネス・オブジェクトがアプリケーション固有のビジネス・オブジェクトに変換されます。アウトバウンド・マップは汎用ビジネス・オブジェクトを入力として受け取り、アプリケーション固有のビジネス・オブジェクトを出力として戻します。呼び出しコンテキストが SERVICE_CALL_REQUEST の場合、Foreign Key Cross-Reference 関数ブロックは、以下のアクションを実行します。
アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。
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 |
|
表 111 からわかるように、動詞が Create の場合、Foreign Key Cross-Reference 関数ブロックは、関係表に新規の関係インスタンスを書き込みません。インスタンス ID に対応するアプリケーション固有の外部キー値をまだ持っていないので、この書き込み操作は実行されません。コネクターがアプリケーション固有のビジネス・オブジェクトを処理する場合、新規の行の挿入 (複数行の場合もある) が必要なことがアプリケーションに通知されます。この挿入に成功すると、アプリケーションからコネクターに通知され、コネクターにより Create 動詞とアプリケーションのキー値を使用して該当するアプリケーション固有のビジネス・オブジェクトが作成されます。
呼び出しコンテキストが ACCESS_RESPONSE の場合、呼び出されるマップはアウトバウンド・マップです。つまり、汎用ビジネス・オブジェクトがアプリケーション固有のビジネス・オブジェクトに変換されます。アウトバウンド・マップは汎用ビジネス・オブジェクトを入力として受け取り、アプリケーション固有のビジネス・オブジェクトを出力として戻します。したがって、Foreign Key Cross-Reference 関数ブロックのタスクは、特定の汎用キー値に対応するアプリケーション固有のキーを、外部参照表から取得することです。
呼び出しコンテキストが ACCESS_RESPONSE の場合、Foreign Key Cross-Reference 関数ブロックは、以下のアクションを実行します。
アプリケーション固有のビジネス・オブジェクトである、アプリケーション固有の参加者の参加者タイプを判別します。また、このビジネス・オブジェクトに存在するキー属性が 1 つだけであることを確認します。複数のキー属性が存在する場合、Foreign Key Cross-Reference 関数ブロックは、それらのアプリケーション固有のキー属性のうちのどれに、汎用ビジネス・オブジェクトの外部キーに対応するアプリケーション固有のキーを取り込めばよいかを判断できません。したがって、RelationshipRuntimeException 例外がスローされます。
Foreign Key Cross-Reference 関数ブロックは、汎用ビジネス・オブジェクトの動詞に関係なく、これらのアクションを外部関係表で実行します。
Foreign Key Cross-Reference 関数ブロックや Foreign Key Lookup 関数ブロックを使用する場合は、以下のヒントに留意してください。
Foreign Key Cross-Reference 関数ブロックに関しては、使用後、この検査を行う必要はありません。この関数ブロックを使用すると、目的のアプリケーション固有のキー値が存在しない場合には、外部関係表にエントリーが自動的に追加されるからです。