トリガーと関数

最終公開日 : Sep 16, 2026
EBX® データモデルでは、トリガーと計算フィールドを定義できます。また、自動インクリメントフィールドも提供されます。
Related information

計算値

デフォルトでは、データは XML リポジトリに読み込まれ、保持されます。ただし、データは計算や外部データベース アクセス (RDBMS や中央システムなど) の結果である場合もあります。
EBX® を使用すると、現在のデータセットのコンテキストで他のデータを考慮に入れることができます。
これは、計算ルール を定義することによって可能になります。
計算ルールは、osd:function エレメントを使用してデータモデルで指定されます (以下の例を参照)。
  • class 属性の値は、Java インターフェイス ValueFunction を実装する Java クラスの修飾名にする必要があります。
  • 追加のパラメーターはデータモデルレベルで指定できます。その場合、Java Bean 規則が適用されます。
<xs:element name="computedValue">
    <xs:annotation>
        <xs:appinfo>
            <osd:function class="com.foo.ComputeValue">
                <param1>...</param1>
                <param...n>...</param...n>
            </osd:function>
        </xs:appinfo>
    </xs:annotation>
    ...
</xs:element>

検証の無効化

関数の実行に時間がかかる場合、計算値の検証を無効にすると便利なことがあります。実際、関数が N レコードのテーブルにアタッチされている場合、このテーブルを検証するときに N 回呼び出されます。データモデルで指定されたプロパティ osd:disableValidation= "true" を使用すると、計算値の検証を無効にすることができます (以下の例を参照)。
<xs:element name="computedValue" osd:disableValidation="true">
    <xs:annotation>
        <xs:appinfo>
            <osd:function class="com.foo.ComputeValue">
                ...
            </osd:function>
        </xs:appinfo>
    </xs:annotation>
    ...
</xs:element>

トリガー

データセットまたはテーブルレコードは、作成、更新、削除などの操作が実行されたときに自動的に実行されるメソッドに関連付けることができます。
データモデルでは、これらのトリガーは、osd:trigger エレメントを使用して、annotation/appinfo エレメントの下に宣言する必要があります。

データセットのトリガー

データセットトリガーの場合、抽象クラス InstanceTrigger を拡張する Java クラスをエレメント osd:trigger 内に宣言する必要があります。
データセットトリガーの場合は、データモデルの root エレメントのすぐ下に annotation/appinfo/osd:trigger タグを定義することをお勧めします。
<xs:element name="root" osd:access="--">
   ...
   <xs:annotation>
        <xs:appinfo>
            <osd:trigger class="com.foo.MyInstanceTrigger">
                <param1>...</param1>
                <param...n>...</param...n>
            </osd:trigger>
        </xs:appinfo>
    </xs:annotation>
    ...
</xs:element>

テーブルのトリガー

テーブルレコードトリガーの定義では、抽象クラス TableTrigger を拡張する Java クラスを osd:trigger エレメント内に定義する必要があります。関連するテーブルまたはテーブルタイプを記述するエレメントのすぐ下に annotation/appinfo/osd:trigger エレメントを定義することをお勧めします。
テーブルエレメントの場合
<xs:element name="myTable" type="MyTableType" minOccurs="0" maxOccurs="unbounded">
    <xs:annotation>
        <xs:appinfo>
            <osd:table>
                <primaryKeys>/key</primaryKeys>
            </osd:table>
            <osd:trigger class="com.foo.MyTableTrigger" />
        </xs:appinfo>
    </xs:annotation>
</xs:element>
テーブル型エレメントの場合
<xs:complexType name="MyTableType">
   ...
   <xs:annotation>
       <xs:appinfo>
          <osd:trigger class="com.foo.MyTableTrigger">
             <param1>...</param1>
             <param...n>...</param...n>
          </osd:trigger>
       </xs:appinfo>
   </xs:annotation>
   ...
</xs:complexType>
追加のパラメーターを定義できるため、実装された Java クラスは Java Bean プロトコルに準拠する必要があります。上記の例では、Java クラスはメソッド getParam1()setParam1(String)getParamX()setParamX(String) などを定義する必要があります。

自動インクリメントされた値

自動インクリメント値を定義することができます。自動インクリメント値はテーブル内でのみ許可され、xs:int または xs:integer 型にする必要があります。
自動インクリメントは、エレメント annotation/appinfo の下のエレメント osd:autoIncrement を使用してデータモデルに指定されます。
<xs:element name="autoIncrementedValue" type="xs:int">
    <xs:annotation>
        <xs:appinfo>
            <osd:autoIncrement />
        </xs:appinfo>
    </xs:annotation>
</xs:element>
また、オプションのエレメントとして、startstepの 2 つがあります。
  • start 属性は、この自動増分の最初の値を指定します。この属性が指定されていない場合は、デフォルトで値 1 が設定されます。
  • step 属性は、自動インクリメントによって生成される次の値のステップを指定します。この属性が指定されていない場合は、デフォルトで値 1 が設定されます。
    <xs:element name="autoIncrementedValue" type="xs:int">
        <xs:annotation>
            <xs:appinfo>
                <osd:autoIncrement>
                    <start>100</start>
                    <step>5</step>
                </osd:autoIncrement>
            </xs:appinfo>
        </xs:annotation>
    </xs:element>
    osd:autoIncrement を指定するフィールドの動作は次のとおりです。
  • 新しいレコードが挿入され、フィールド値が未定義の場合は、フィールド値の計算と割り当てが実行されます。
  • プログラムによる挿入ですでに null 以外の値が指定されている場合は、割り当ては実行されません。たとえば、アーカイブインポートまたは XML インポートで値が指定されている場合は、その値が保持されます。
    したがって、非表示モードまたは上書きモードでのレコード挿入では割り当ては実行されません。
  • 新しく割り当てられた値は、可能な限り、リポジトリのスコープ内で一意です。より正確には、割り当ての一意性は、データモデルのすべてのデータセットに及び、すべてのデータスペースにも及びます。後者の場合、osd:autoIncrement がレコードの主キーの一部である場合、競合が発生しないことが十分に保証された状態で、データスペースを親にマージできます。
    この原則には非常に具体的な制限があります。値を指定する大量更新トランザクションが、同じフィールドに値を割り当てるトランザクションと同時に実行されると、後者のトランザクションが最初のトランザクションによって設定される値を割り当てる可能性があります (異なるデータスペース間ではロックはありません)。
    内部的には、自動インクリメント値はリポジトリの「自動インクリメント」テーブルに保存されます。ユーザーインターフェイスでは、管理者は 領域からこの値にアクセスできます。このフィールドは自動的に更新され、リポジトリ内の任意のインスタンスまたはデータスペースで、関連付けられた osd:autoIncrement フィールドに設定された最大値を定義します。この値は、更新されるテーブルで見つかった最大値を考慮して計算されます。
    場合によっては、たとえば、自動インクリメント範囲が異なる複数の環境 (開発、テスト、実稼働) を管理する必要があるときは、この「最大値」チェックを回避する必要があります。この特定の動作は、disableMaxTableCheck プロパティを使用して実装できます。自動インクリメント値に競合が発生する可能性があるため、絶対に必要な場合を除き、このプロパティを有効にすることは一般的に推奨されません。ただし、このプロパティは次の方法で設定できます。
  • ローカルで、自動インクリメント宣言のパラメーターエレメントを設定 (<disableMaxTableCheck>true</disableMaxTableCheck>)。
  • データモデル全体で、データモデル宣言のエレメント xs:appinfo<osd:autoIncrement disableMaxTableCheck="true"/> を設定。
  • EBX® メイン構成ファイルで、プロパティ ebx.autoIncrement.disableMaxTableCheck=true をグローバルに設定。
    TIBCO EBX® メイン構成ファイル を参照してください。
注意:
このオプションがグローバルに有効になっている場合、たとえば XML または CSV からインポートすることによって、自動インクリメントテーブルにレコードを作成できるようになります。このオプションを選択しない場合、リポジトリの整合性を確保するために、自動インクリメントテーブルにレコードを作成することは禁止されます。