クラスへのリレーションシップの追加
リレーションシップは、2 つ以上のオブジェクト・インスタンスの相互の関連性を定義する、特別なプロパティのタイプです。例えば、企業を表す Company クラスが、社員を表す Employee クラスとの一対多のリレーションシップを持っているという場合です (つまり、1 つの企業には 1 人、または複数の社員が在籍し、各社員は特定の企業と関連しているということです)。
リレーションシップは、プロパティとは異なります。すべてのリレーションシップは 2 つで 1 組みです。リレーションシップのすべての定義には、対応する逆のリレーションシップがあり、それが反対側を定義します。
リレーションシップの詳細は、"リレーションシップ" を参照してください。
新規のリレーションシップをクラス定義に追加するには、以下の 2 つの方法があります。
-
クラス・エディタを使用してクラス定義にリレーションシップを追加する方法
-
新規プロパティ・ウィザードを使用する方法
クラス・エディタを使用してリレーションシップを追加するには、クラス・エディタの空の行にカーソルを置き、リレーションシップ宣言を入力します。
Class MyApp.Company Extends %Persistent
{
Relationship TheEmployees As Employee [cardinality=many, inverse=TheCompany];
}
リレーションシップ定義では、cardinality と inverse の両方のキーワードに値を指定する必要があります。
このリレーションシップには 2 つの双方向の関係があるので、Employee のクラス定義には逆のリレーションシップも入力します。
Class MyApp.Employee Extends %Persistent
{
Relationship TheCompany As Company [cardinality=one, inverse=TheEmployees];
}
両方のリレーションシップが正しく相互に対応していない場合、コンパイル時にエラーが返されます。
リレーションシップ・プロパティを作成する新規プロパティ・ウィザード
新規プロパティ・ウィザードを使用して、新規のリレーションシップ・プロパティを作成できます。このウィザードを起動するには、[クラス]→[追加]→[プロパティ] を選択します。または、クラス・インスペクタで右クリックして、[追加]→[新規プロパティ] を選択します。ツールバーの [新規プロパティ] ボタンをクリックすることもできます。
新規プロパティ・ウィザードでは、情報の入力が促されます。この手順は、プロパティ・タイプで リレーションシップ を選択することを除けば、新規の非リレーションシップ・プロパティを作成する手順と同じです。
名前および説明ページ
新規プロパティ・ウィザードで、以下の情報の入力が促されます (これらの値は後で変更できます)。
(必須) リレーションシップの名前。これは、有効なリレーションシップ (プロパティ) 名である必要があります。また、定義済みの既存のリレーションシップやプロパティと同じ名前を付けることはできません。
"識別子のルールとガイドライン" を参照してください。
(オプション) 新規リレーションシップに関する説明。この説明は、クラス・ドキュメントがオンライン・クラス・ライブラリ・ドキュメントで表示されるときに使用されます。
説明には、HTML フォーマット・タグを記述することもできます。"クラスの定義と使用" の "クラス・ドキュメントの作成" を参照してください。
プロパティ・タイプ・ページ
新規プロパティ・ウィザードでは、各種のプロパティ・タイプが表示されます。リレーションシップを選択し、もう一方のリレーションシップのクラス名を入力します。
リレーションシップの特性ページ
新規プロパティ・ウィザードでは、追加のリレーションシップ属性の入力が促されます。これには、以下のものがあります。
Cardinality
このリレーションシップ・プロパティは、1 つの関連するオブジェクトのインスタンスを参照します。結果のプロパティは、単純な参照フィールドとして動作します。
このリレーションシップ・プロパティは、複数の関連するオブジェクトのインスタンスを参照します。結果のプロパティは、オブジェクトのコレクションとして動作します。
一のカーディナリティと同じですが、このプロパティは、依存したリレーションシップであり、このオブジェクトの親を参照する点が異なります。親子リレーションシップを作成すると、子は個別に格納されるのではなく、親内に格納されるため、インデックスの作成を選択できません。これは、グローバル構造を見ることで理解できます。子には、追加の添え字を作成することにより、自動的にインデックスが付けられます。
多のカーディナリティと同じですが、このプロパティは、依存したリレーションシップであり、子オブジェクトのコレクションを参照する点が異なります。
Inverse :
[参照] ボタンをクリックしてクラスを選択するか、逆リレーションシップの新規クラス名を入力します。
クラスからプロパティを選択するか、逆リレーションシップの新規プロパティ名を入力します。
その他の変更
実装するその他の変更を選択します。
このフィールドは、ウィザードの前のページで指定したクラス名が存在しない場合にのみ有効です。新しいクラスをパッケージに追加するには、このオプションを選択します。リレーションシップが含まれたクラスをコンパイルするには、その前に新規クラスをコンパイルする必要があります。
このフィールドは、ウィザードの前のページで指定した参照されるクラスのプロパティが存在しない場合にのみ有効です。この新しいプロパティをクラスに追加するには、このオプションを選択します。リレーションシップが含まれたクラスをコンパイルするには、その前にこの新規プロパティが含まれたクラスをコンパイルする必要があります。
このフィールドは、参照されるクラスのプロパティが既に存在する場合にのみ有効です。このオプションを選択すると、参照されるプロパティが、定義しているプロパティとリレーションシップを持つように変更されます。
選択すると、このプロパティのインデックスを定義できます。これは、一対多リレーションシップにのみ適用されます。親子リレーションシップでは無効になります。
新規プロパティ・ウィザードで新規のリレーションシップを作成した結果
新規プロパティ・ウィザードで新規リレーションシップを作成した後、クラス・エディタは更新され、新規のリレーションシップ定義が表示されます。以下に例を示します。
/// This is an Employee class
class MyApp.Employee extends %Persistent
{
/// We have a one-to-many relationship with Company
Relationship Company As Company [cardinality=one, inverse=Employees];
}
このリレーションシップをさらに変更する場合は、クラス・エディタ、またはクラス・インスペクタを使用します。
また、リレーションシップ・ウィザードを使用すると、もう一方のリレーションシップに必要な変更を自動的に決定することができます。
リレーションシップ・ウィザードを開くには:
-
クラス・インスペクタで、プロパティのリストを表示します。
-
プロパティ・リスト内の目的のリレーションシップを右クリックし、ポップアップ・メニューから [リレーションシップの追加/変更] を選択します。