管理された関連付けの実装

管理された関連付けによるアプローチでは、親宛先は、子オブジェクトのプロパティに対する変更について更新を処理することはなく、親から参照される子の id 値に対する変更を処理する役割だけを担います。ただし、Person オブジェクトが Address プロパティを持っている例のような場合は、階層値によるアプローチを使用して、人物の住所の都市に対する変更を Person 宛先で処理します。

管理された関連付けによるアプローチでは、Address 宛先で都市に対する変更を処理します。ユーザーが、異なる id を持つ Address を Person オブジェクトの Address プロパティに割り当てた場合は、Person 宛先で変更を処理します。関係において、サーバーからクライアントへのオブジェクトグラフの遅延ロードをサポートするかどうかを設定することもできます。

単方向の 1 対 1、1 対多、または多対 1 の関係、あるいは双方向の多対多の関係となる、宛先間の関係を設定できます。管理された関連付けは、宛先の one-to-oneone-to-many、および many-to-many エレメントで設定します。これらのエレメントは metadata エレメントのサブエレメントであり、metadataproperties エレメントのサブエレメントです。

データベーステーブルに依存する管理された関連付けにおいて、多対多の関係で作業を行う場合は、いずれかのテーブルの外部キーを使用するのではなく、結合テーブルを作成して、データベースが使用するテーブル間の関係を確立する必要があります。

サーバーからクライアントへのオブジェクトグラフの遅延ロードを有効にするには、one-to-oneone-to-many、または many-to-many エレメントの lazy 属性を true に設定します。クライアントから初めて値にアクセスすると、複数値の関連付けの場合は ArrayCollection.getItem() メソッドから、または単一値の関連付けの場合は Managed.getProperty() メソッドから、ItemPendingError がスローされます。このスローによって、参照されたオブジェクトを取得する要求が発生し、ItemPendingError 内のイベントハンドラが呼び出されて、アイテムが使用可能になったときにクライアントに通知されます。Flex データバインディングを使用しているときは、lazy 属性を true に設定している場合に、この動作が自動的に実行され、データは必要になった時点で出現します。

データバインディングを遅延ロードと組み合わせて使用しない場合は、コードの中で ItemPendingError をキャッチして適切に処理できます。アイテムを ArrayCollection から取得するために非同期呼び出しを必要とする場合は、ItemPendingError がスローされます。このエラーの受信側で、要求されたアイテムが使用可能になったことの通知を非同期呼び出しの完了時に必要とする場合は、受信側で addResponder() メソッドを使用し、mx.rpc.IResponder インターフェイスをサポートするオブジェクトを指定して、アイテムが使用可能になったときに応答する必要があります。IResponder インターフェイスは mx.collections.ItemResponder クラスで実装されており、data プロパティがサポートされています。

次の例では、クライアントの groupCollection オブジェクトでグループオブジェクトがまだ使用できないときに、ItemPendingError がスローおよびキャッチされます。groupCollection オブジェクトはサーバーの AssocGroup 宛先から設定されます。宛先には admin プロパティがあります。このプロパティは AssocPerson インスタンスへの参照であり、遅延ロードされます。printAdminName() メソッドは、groupCollection オブジェクト内の最初のグループに対して呼び出されます。グループが使用できない場合は、メソッドから ItemPendingError がスローされます。ItemPendingError を処理するために ItemResponder が登録されています。ItemResponder は、グループが使用可能になったときに printAdminName() メソッドを呼び出します。失敗が生じた場合、ItemResponder は fetchAdminError() メソッドを呼び出します。

...
import mx.collections.ItemResponder;
import mx.messaging.messages.ErrorMessage;
import mx.collections.errors.ItemPendingError;
...

public function printAdminName (data:Object, group:Object):void {
    trace(group.admin.firstName);
}

public function fetchAdminError(message:ErrorMessage):void {
    trace("error occurred fetching admin: " + message.faultString);
}

// この関数は、遅延ロードされる Person への参照を admin プロパティに持つ
// "group" オブジェクトを取得するために呼び出されます。
// printAdminName 関数は、このオブジェクトがクライアントでまだ
// ロードされていない場合に、group.admin プロパティを取得するときに
// ItemPendingError をスローする場合があります。
// 関数は、値が使用可能になったときに再び printAdminName を呼び出す
// リスナーを登録します。

public function dumpAdminName():void {
    try {
        printAdminName(null, groupCollection.getItemAt(0));
    }
    catch (ipe:ItemPendingError) {
        trace("item pending error fetching admin.");
        ipe.addResponder(new ItemResponder(printAdminName, fetchAdminError, 
        groupCollection.getItemAt(0)));
    }
}
...

まとめると、階層値によるアプローチでは、単一の宛先でグラフの状態全体を管理します。しかし、管理された関連付けによるアプローチでは、親宛先は、参照される子オブジェクトの ID、および親オブジェクトと子オブジェクト間の関係を管理します。管理された関連付けによるアプローチでは、子アセンブラが子オブジェクト自身の状態を所有します。管理された関連付けによるアプローチを使用する場合、あるアプリケーションでは各宛先を互いに独立して使用し、別のアプリケーションではそれらの宛先をまとめて使用できる、という利点もあります。

サブトピック

管理された関連付けの例について

Flex 2.01