継承と値の解決

最終公開日 : Sep 16, 2026
Related information

概要

継承の原則は、複数のコンテキストまたはエンティティによって共有されるリソースを相互化することです。TIBCO EBX® は、データ値を定義、因数分解、および解決するためのメカニズムを提供します。データセットの継承 および 継承されたフィールド です。
さらに、値を計算するために 関数 を定義できます。
注意:
この章で説明する継承メカニズムを「構造的継承」と混同しないでください。これは通常、モデルに適用され、たとえば UML クラスダイアグラムで提案されます。
以下も参照してください。:

データセットの継承

データセットの継承は、データが子会社やビジネスパートナーなどのグローバルなエンタープライズコンテキストに適用される場合に特に役立ちます。
データセットの階層が与えられると、共通データをルートまたは中間データセットに分解し、特定のコンテキストで特殊なデータを定義することができます。
データセットの継承メカニズムについては、以下の データセットの継承 で詳しく説明しています。

継承されたフィールド

データセット間のグローバルなビルトイン関係を利用するデータセットの継承とは異なり、継承されたフィールドは、データ構造に固有のよりきめ細かい依存関係を利用します。これにより、ビジネスエンティティレベルでデータを因数分解および特殊化できます。
たとえば、モデルで「Product」が「FamilyOfProducts」に関連付けられていると指定されている場合、「Product」の一部の属性は、関連付けられている「FamilyOfProducts」で定義されている属性から値を継承する可能性があります。
注意:
同じデータセットで両方の継承メカニズムを使用する場合、フィールド継承はデータセット継承よりも優先されます。
以下も参照してください。:

計算値 (関数)

データモデルでは、ノードが 計算された値 を保持するように指定することもできます。この場合、値が要求されるたびに、指定された Java Bean 関数が実行されます。
この関数は、現在のレコードの値や別のテーブルに基づく計算などの現在のコンテキストを考慮し、サードパーティのシステムにリクエストを送信できます。
以下も参照してください。:

データセットの継承

データセット継承宣言

データセット継承メカニズムは、DMA からデータモデル ( > ) で宣言するか、XML スキーマ定義で直接宣言します ( > )。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:ebxbnd="urn:ebx-schemas:binding_1.0">
  <xs:annotation>
    <xs:appinfo>
      <osd:inheritance>
        <dataSetInheritance>all</dataSetInheritance>
      </osd:inheritance>
    </xs:appinfo>
  </xs:annotation>
   ...
</xs:schema>
エレメント osd:inheritance は、このデータモデルに基づくデータセットでの継承の使用を指定するためのプロパティ dataSetInheritance を定義します。次の値を指定できます。
  • all は、データモデルに基づいてすべてのデータセットに対して継承が有効になっていることを示します。
  • none は、データモデルに基づくすべてのデータセットの継承が無効になっていることを示します。
指定しない場合、継承メカニズムは無効になります。

値ルックアップメカニズム

値のデータセット継承ルックアップメカニズムは次のように進行します。
  1. 値がローカルで定義されている場合は、値が返されます。
    明示的に null にすることもできます。
  2. それ以外の場合は、データセットの階層内のデータセットのビルトインの子と親の関係に従って、最初のローカルで定義された値を検索します。
  3. ローカルで定義された値が見つからない場合は、デフォルト値が返されます。
    デフォルト値が定義されていない場合、null が返されます。
    **注意:**デフォルト値は次の場所では定義できません。
    • 単一の主キーノード
    • 自動インクリメントノード
    • 計算値を定義するノード

レコードルックアップメカニズム

値と同様に、テーブルレコードも複数のコンテキストによってユニットとして継承できますが、特定のコンテキストに対して部分的に再定義 (上書き)、特定のコンテキストに対して定義 (ルートモード)、または 非表示に することができます。
正式には、テーブルレコードには 4 つの異なる定義モードのいずれかがあります。
ルートレコード
テーブルでローカルに定義されており、親はありません。これは、同じ主キーを持つレコードが親テーブルに存在しないか、この親が非表示レコードであることを意味します。
レコードの上書き
テーブルでローカルに定義され、親レコードがあります。これは、同じ主キーを持つレコードが親テーブルに存在し、この親が非表示レコードではないことを意味します。上書きレコードは、明示的に再定義する値を除いて、その値を親から継承します。
継承されたレコード
現在のテーブルでローカルに定義されておらず、親レコードがあります。すべての値が継承されます。
関数は常に現在のレコードのコンテキストで解決され、継承されません。
非表示レコード
同じ主キーを持つ親が定義されている場合、この親がテーブルの子孫に表示されないことを指定します。
以下も参照してください。:

テーブルレベルでの継承動作の定義

データモデルのテーブルの宣言で管理ルールを指定することもできます。
以下も参照してください。:

継承されたフィールド

特定の継承メカニズムにより、他のテーブルとの関係に従ってフィールドの値をフェッチできます。

フィールド継承宣言

次のように、特定の継承を指定する必要があります。
  • 基礎となるデータモデルのノードの高度なプロパティ。
  • 基礎となるデータモデルのターミナルノード。次のように宣言されます。
    <xs:element name="sampleInheritance" type="xs:string">
        <xs:annotation>
            <xs:appinfo>
                <osd:inheritance>
                    <sourceRecord>
                        /root/table1/fkTable2, /root/table2/fkTable3
                    </sourceRecord>
                    <sourceNode>color</sourceNode>
                </osd:inheritance>
            </xs:appinfo>
        </xs:annotation>
    </xs:element>
    エレメント sourceRecord は、値の継承元のレコードを検索する方法を説明する式です。これは、現在のエレメントからソーステーブルへの外部キーまたは外部キーのシーケンスです。
    sourceRecord がデータモデルで定義されていない場合、継承されたフィールドは現在のレコードからフェッチされます。
    エレメント sourceNode は、ソースレコードで継承するノードのパスです。
    特定の継承については、次の条件を満たす必要があります。
    • エレメント sourceNode は必須です。
    • ソースレコードへのパスの式は、現在のエレメントからソースレコードへの外部キーの一貫したパスにする必要があります。この式には、1 対 1 および 0 対 1 の関係のみが含まれている必要があります。
    • sourceRecord には、集約されたリストエレメントを含めることはできません。
    • sourceRecord の各エレメントは外部キーにする必要があります。
    • 継承されたフィールドが外部キーでもある場合、sourceRecord はそれ自体を参照して、継承された値のソースレコードへのパスを取得できません。
    • sourceRecord のすべてのエレメントが存在する必要があります。
    • ソースノードは、ソースレコードを含むテーブルに属している必要があります。
    • ソースノードはターミナルにする必要があります。
    • ソースノードは書き込み可能にする必要があります。
    • ソースノードタイプは、現在のノードタイプと互換性がある必要があります。
    • ソースノードのカーディナリティは、現在のノードのカーディナリティと互換性がある必要があります。
    • 継承元のフィールドが同じレコードにフェッチされている場合、ソースノードを継承フィールドと同じにすることはできません。

値ルックアップメカニズム

継承されたフィールド値のルックアップメカニズムは、次のように進行します。
  1. 値がローカルで定義されている場合は、値が返されます。
    明示的に null にすることができます。
  2. それ以外の場合は、データモデルで定義されているプロパティに従って、継承元のソースレコードと値を検索します。
  3. このプロセスは再帰的です。ソースノードがローカルで値を定義していない場合は、ソースノードの継承動作に従って値が検索されます。

検証の無効化

場合によっては、パフォーマンス上の理由から継承されたフィールドの検証を無効にすると便利なことがあります。データモデルで指定されたプロパティ osd:disableValidation= "true" を使用すると、継承されたフィールドの検証を無効にできます (以下の例を参照)。
例:
<xs:element name="sampleInheritance" type="xs:string" osd:disableValidation="true">
    <xs:annotation>
        <xs:appinfo>
            <osd:inheritance>
                <sourceRecord>
                    /root/table1/fkTable2, /root/table2/fkTable3
                </sourceRecord>
                <sourceNode>color</sourceNode>
            </osd:inheritance>
        </xs:appinfo>
    </xs:annotation>
</xs:element>

最適化およびリファクタリングサービス

EBX® は、データセットの階層におけるデータセットの継承を最適化するためのビルトインのユーザーサービスを提供します。このサービスは、次の機能を実行します。
  • **重複値の処理:**継承された値の重複であるすべてのパラメーター値を検出して削除します。
  • **共通値の相互化:**共通の祖先の子孫の間で共通の値を検出し、相互化します。

プロシージャの詳細

データセットはボトムアップで処理されます。つまり、レベル N のデータセットでサービスを実行し、N+1 がその子のレベル、N+2 がその子の子のレベルである場合、サービスはまずレベル N+2 のデータセットを処理して、レベル N+1 のデータセットに対して最適化できるかどうかを判断します。次に、レベル N+1 の最適化をレベル N に対して行います。
注意:
  • これらの最適化およびリファクタリング関数は、データモデルで宣言されているデフォルト値を処理しません。
  • 最適化手順で考慮される最高レベルは、常にサービスが実行されるデータセットです。これは、ターゲットデータセットとそれ自体の祖先の間で最適化とリファクタリングが実行されないことを意味します。
  • テーブルの最適化は、同じ主キーを持つレコードに対して実行されます。
  • 継承されたフィールドは最適化されていません。
  • 最適化およびリファクタリング機能は、データセットがアクティブ化されている場合、データセットの解決されたビューを変更しません。

サービスの可用性

「最適化とリファクタリング」サービスは、子データセットがあり、データセット情報で「アクティブ化」プロパティが「いいえ」に設定されているデータセットで使用できます。
このサービスは、現在のデータセット値への書き込みアクセス権を持つすべてのプロファイルで利用できます。プロファイルに制限付きアクセス権を設定することで無効にできます。
注意:
パフォーマンス上の理由から、アクセス権はすべてのノードおよびテーブルレコードで検証されるわけではありません。