ヘッダーをスキップ

プロキシ・インダイレクションの使用

JDK 1.3以上から、JavaクラスのProxyを使用して、定義されたインタフェースの代役として動的プロキシ・オブジェクトを使用できるようになりました。特定のTopLinkマッピング(OneToOneMappingVariableOneToOneMappingReferenceMappingおよびTransformationMapping)はプロキシ・インダイレクションを使用するように設定できます。これによって、ユーザーのドメイン・モデルにTopLinkクラスを含める必要なく、TopLinkインダイレクションを利用できます。プロキシ・インダイレクションは1対1リレーションシップ・マッピングに対応し、インダイレクション・コンテナはコレクション・マッピングに対応します。

TopLinkはプロキシ・インダイレクションをサポートしませんが、修正メソッドでuseProxyIndirectionメソッドを使用できます。

プロキシ・インダイレクションを使用するには、ユーザーのドメイン・モデルが次の基準を満たす必要があります。

次のコードはEmployee->Addressの1対1リレーションシップを示しています。

public interface Employee {
    public String getName();
    public Address getAddress();
    public void setName(String value);
    public void setAddress(Address value);
    . . .
}
public class EmployeeImpl implements Employee {
    public String name;
    public Address address;
    . . .
    public Address getAddress() {
        return this.address;
    }
    public void setAddress(Address value) {
        this.address = value;
  }
}
public interface Address {
    public String getStreet();
    public void setStreet(String value);
  . . .
}
public class AddressImpl implements Address {
    public String street;
  . . .
}

例5-3では、EmployeeImplクラスおよびAddressImplクラスの両方がpublicインタフェースを(EmployeeAddressをそれぞれ)実装します。つまり、AddressImplが1対1リレーションシップのターゲットとなるため、これはインタフェースを実装するただ1つのクラスになります。ただし、EmployeeImplが透過的インダイレクションを使用する別の1対1リレーションシップのターゲットになる場合は、これも次に示すようにインタフェースを実装する必要があります。

Employee emp = (Employee) session.readObject(Employee.class);
System.out.println(emp.toString());
System.out.println(emp.getAddress().toString());
// Would print:
[Employee] John Smith
{ IndirectProxy: not instantiated }
String street = emp.getAddress().getStreet();
// Triggers database read to get Address information
System.out.println(emp.toString());
System.out.println(emp.getAddress().toString());
// Would print:
[Employee] John Smith
{ [Address] 123 Main St. }

プロキシ・インダイレクションを使用しても、挿入のためのドメイン・オブジェクトのインスタンス化方法は変わりません。次のようなコードをそのまま使用します。

Employee emp = new EmployeeImpl("John Smith");
Address add = new AddressImpl("123 Main St.");
emp.setAddress(add);


関連トピック

インダイレクションの使用
インダイレクションの理解

Javaのプロキシ・インダイレクションの実装