高度なカスタマイズ > サービスおよびインフラストラクチャのカスタマイズ > システム生成 > ビジネスオブジェクトのモデル化 > モデリング列
  
モデリング列
モデリング列
GenAsPersistableGenAsBinaryLink は、データベース列を指定するためのメカニズムを 3 つ提供します。
1. properties (GeneratedProperty の配列) は、文字列、数値、ブールなどを表します。
2. foreignKeys (GeneratedForeignKey の配列) は、ほかの永続オブジェクトを参照します (および、クラス名/キーペアとして保存されます)。
3. roleA/roleB (GenAsBinaryLink のみ) は、関連付けに使用される外部キーの特殊な形式です。
さらに、derivedProperties (DerivedProperty の配列) は、プロパティと外部キーにコンビニエンスアクセッサを提供します。
これは、一連のプロパティを集めて独自のクラスにするために便利です。このクラスは、1 つのエンティティとして管理し、1 つの永続オブジェクトに統合することができます。GenAsObjectMappable アノテーションは、この目的のために使用されており、Windchill の cookie で広く活用されています。GenAsObjectMappable アノテーションが付けられたクラスが GeneratedProperty のタイプとして指定されると、そのすべてのプロパティがオーナークラスのテーブルの列になります。名前の競合を防止するために、名前は難解なアルゴリズムによって決定される文字/数字パターンを使用して "管理" されます。idA3containerReferenceidA3Persistable.thePersistInfo.theObjectIdentifier.id がマッピングされている idA2A2 は、このマングリングによって生成されています。
GeneratedProperty
SimpleExampleGeneratedProperty (必須で String) タイプの name) の例はすでに示しました。GeneratedProperty では、生成と動作を制御するためのアノテーションメンバーを多数使用できます。詳細については、Windchill の Javadoc を参照してください。
GeneratedForeignKey
外部キーは、モデル化されておらず、WTContained から継承されています。
リスト 9: コンテナ定義の断片
01 @GeneratedForeignKey(name="ContainerLink",
02 foreignKeyRole=@ForeignKeyRole(name="container", type=wt.inf.container.WTContainer.class, referenceType=wt.inf. container.WTContainerRef.class, supportedAPI=SupportedAPI.PRIVATE,
03 constraints=@PropertyConstraints(required=true)),
04 myRole=@MyRole(name="contents", supportedAPI=SupportedAPI.PRIVATE))
SimpleExample のスキーマに対するコンテナ参照の影響として、2 つの列が生成されています (前述)。実際に、これをさらにひも解くと、これらのフィールドは GenAsObjectMappable である WTContainerRef から ObjectReference を介して取得されていることがわかります。外部キーは "単なる" 別のプロパティであると言えますが (実際に、プロパティを一種の ObjectReference でタイプとしてモデル化して、(作成される列の観点からは) "同じ" 結果を達成できます)、Windchill 永続レイヤーは外部キーを一種の関連付けとして認識するため、それらをユーザーに代わって管理できます。その主な利点は、以下のとおりです。
owner=false を設定することによって、foreignKeyRole オブジェクトが (関連付けの一部である場合に) 削除されることを防止できます。
cascade=true を設定することによって、foreignKeyRole オブジェクトが削除されるときに myRole が削除されるようにできます。
cascade=false (デフォルト値) のときに役割 foreignKeyRole が削除されると、myRole によって保持されている参照が自動的に解除されます。
参照のアクセッサだけではなく、自動的に生成される参照先のオブジェクトのアクセッサも取得できます。
autoNavigate=true を設定することによって、(required=true の場合に) 参照先のオブジェクトを自動的に読み込むことができるので、参照先のオブジェクトにアクセスするときに、ほかのデータベースにヒットすることを防止できます。
外部キーリンクを、ほかのバイナリリンクとまったく同じようにナビゲートできます。
GeneratedForeignKey は、所定の永続オブジェクトが "多くとも" 1 つのほかの永続オブジェクトに関連付けられている場合に使用されます。WTReference の具象サブタイプの GeneratedProperty ではなく GeneratedForeignKey を使用するようにしてください。GeneratedForeignKey を使用すると、Windchill 永続アーキテクチャで参照を関連付けとして管理できるからです。ただし、これには例外がいくつかあります。特に、WTPrincipals (ユーザー) との関連付けは、GeneratedForeignKey としてではなく、WTPrincipalReference タイプの GeneratedProperty としてモデル化される必要があります。これは、関連付けを管理する必要がないからであり (ユーザーは削除できません)、また参照のアクセッサ "のみ" が必要であるからです (これにはユーザーに関する必要な情報がすべて含まれています)。
* 
GeneratedRoles とまったく同じように、作業版数のマスターを拘束するために一般的に行われている方法で、既存の (親クラス/インタフェースでモデル化されている) 外部キーを拘束できます。外部キーを拘束するとき、継承元の外部キーの値と異なる値を指定する必要があるだけで、親のすべてのプロパティを再度指定する必要はありません。
GeneratedRole
GeneratedRole アノテーションは、SimpleExampleLink で説明した GenAsBinaryLink の役割 A と役割 B について説明するために使用されます。役割は、リンクを 2 つの永続オブジェクトに関連付ける特殊な外部キーとして考えることができます (役割には外部キーと同じ継承機能があります)。外部キーは、関連付けられている役割の多重度が 0 から 1 であり、関連付けが追加のデータ (プロパティ) を必要としない場合にのみ適用可能である一方、バイナリリンクは、関連付けが多対多である場合、関連付けにプロパティがある場合、または関連付けがその他の方法で PTC ビジネスオブジェクトで永続化される場合 (既存の PTC クラスは変更できないため) に適用可能です。
DerivedProperties
派生プロパティそのものは永続化されませんが、派生プロパティは永続プロパティにコンビニエンスアクセッサ (ゲッター、セッター、および照会定数) を提供します。これがなければ、cookie 内または外部キー参照間にある永続プロパティを識別できなくなります。c というフィールドが b という cookie 内で識別できなくなっており、この cookie 自体も現在のクラスのプロパティである a という cookie 内で識別できなくなっているとします。
これには、これらの cookie が初期化されていない場合に発生する可能性のある NullPointerExceptions に注意しながら、this.getA().getB().getC() を使用することによってアクセスできます。または、単純にこの派生プロパティをクラスに追加し、すべての処理 (NullPointerException の処理を含む) が自動的に行われるようにすることもできます。
リスト 10: a.b.c 派生プロパティ
@DerivedProperty(name="c", derivedFrom="a.b.c")
この派生プロパティを使用して、this.getC() を呼び出すことができます。
関連付けられているオブジェクトのフィールドに外部キーを介してアクセスする必要がある場合は、外部キーの名前の後ろに . ではなく > を区切り記号として追加します。関連付けられている mastername に直接アクセスするために、WTPart は次の派生プロパティに依存します。
リスト 11: master>name 派生プロパティ
@DerivedProperty (name="name " , derivedFrom="master>name " )