fill メソッドでのオブジェクト関係の実装

Java アダプタを使用するときは、クエリを使用して 2 つのオブジェクト間の関係を実装できます。クエリでは、アセンブラで定義された fill メソッドのいずれかのパラメータが、関連するオブジェクトの ID になります。たとえば Company オブジェクトが Employee インスタンスを多数持つ場合など、オブジェクトのコレクションが多数ある場合には、クエリによるアプローチのほうが、管理された関連付けによるアプローチよりも効率的になります。

クエリによるアプローチで関係を実装する方法にはいくつかの特徴があり、すべての状況に適しているというわけではありません。ユーザーが従業員の companyId を変更した場合、Data Management Service では、従業員のリストを表示するクライアントが自動的に更新されるように、その変更の影響を受ける fill メソッドの結果を更新する必要があります。Data Management Service のデフォルトでは、自動更新機能が使用され、従業員を返す保留中の fill メソッドがすべて再実行されます。これらのクエリが過度に再実行されないようにこの動作を調整することができますが、そのためにはアセンブラにさらにコードを追加する必要があります。自動更新の使用の詳細については、fill メソッドの結果に対する変更の検出を参照してください。

また、クエリによるアプローチでは、関連付けを更新するときに競合が検出されません。2 つのクライアントから同じ会社に、ほぼ同時に従業員を追加したという場合には、競合を検出する必要はないと考えられますが、2 つのクライアントから同じ顧客の住所リストを同時に更新したという場合には、競合を検出する必要があると考えられます。管理された関連付けプロパティを使用する場合は、Data Management Service の競合検出メカニズムを利用して、コレクションの完全な内容についてデータ競合を検出することができます。しかし、fill メソッドを使用する場合は、アイテムのプロパティについてしか競合が検出されず、アイテムが返された fill 済みのコレクションについては競合が検出されません。

このセクションでは、Flex データサービスに付属のサンプル Web アプリケーションに含まれている CRM アプリケーションからの抜粋コードを示します。このアプリケーションでは、会社と従業員との間の関係を EmployeeAssembler クラスの fill() メソッドで実装しています。アプリケーションの Java アセンブラと DAO クラスのソースコードは、サンプル Web アプリケーションの WEB_INF/src/samples/crm ディレクトリにあります。

次の例は、CRM アプリケーションにある EmployeeAssembler クラスの fill() メソッドです。メソッドの中で、クライアントの fill 要求で提供された数値の会社 ID に基づいて、従業員を会社によって検索する部分を、ボールド体のテキストで示しています。

...
public Collection fill(List fillParameters)
{
    EmployeeDAO dao = new EmployeeDAO();
        if (fillParameters.size() == 0)
            return dao.getEmployees();

    String queryName = (String) fillParameters.get(0);
    if (queryName.equals("match"))
        return dao.findMatchingEmployees((String) fillParameters.get(1));
    if (queryName.equals("byCompany"))
        return dao.findEmployeesByCompany((Integer)
            fillParameters.get(1));
    return super.fill(fillParameters); // 適切なエラーをスローします。
}

次の例では、従業員を会社によって取得する、対応するクライアントサイドの fill 要求を、ボールド体のテキストで示しています。

private function companyChange():void {
    if (dg.selectedIndex > -1)
    {
        if (company != companies.getItemAt(dg.selectedIndex))
        {
            company = Company(companies.getItemAt(dg.selectedIndex));
            dsEmployee.fill(employees, "byCompany",
            company.companyId);
        }
    }
}

Flex 2.01