EBX®データモデルでは、トリガーと計算フィールドを定義できます。また、自動インクリメントされたフィールドを提供します。
デフォルトでは、データはXMLリポジトリで読み取られ、永続化されます。それにもかかわらず、データは、計算および/または外部データベースアクセス、たとえばRDBMSまたは中央システムの結果である可能性があります。
EBX®では、現在のデータセットコンテキストの他のデータを考慮に入れることができます。
これは、計算ルールを定義することで可能になります。
計算ルールは、osd:function
エレメントを使用してデータモデルで指定されます(以下の例を参照)。
class属性の値は、Javaインターフェイス
を実装するJavaクラスの修飾名である必要があります。ValueFunction
追加のパラメーターをデータモデルレベルで指定できます。その場合、JavaBean規則が適用されます。
例:
<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
エレメントの下で宣言する必要があります。
データセットトリガーの場合、抽象クラス
を拡張するJavaクラスをエレメント InstanceTrigger
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>
テーブルレコードのトリガーを定義するためには、抽象クラス
を継承したJavaクラスを TableTrigger
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クラスはJavaBeanプロトコルに準拠している必要があります。上記の例では、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>
また、start
と step
の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からインポートすることにより、自動インクリメントのテーブルにレコードを作成できるようになります。このオプションが選択されていない場合、リポジトリの整合性を確保するために、自動インクリメントのテーブルにレコードを作成することは禁止されています。