JDK 1.3以上から、JavaクラスのProxy
を使用して、定義されたインタフェースの代役として動的プロキシ・オブジェクトを使用できるようになりました。特定のTopLinkマッピング(OneToOneMapping
、VariableOneToOneMapping
、ReferenceMapping
およびTransformationMapping
)はプロキシ・インダイレクションを使用するように設定できます。これによって、ユーザーのドメイン・モデルにTopLinkクラスを含める必要なく、TopLinkインダイレクションを利用できます。プロキシ・インダイレクションは1対1リレーションシップ・マッピングに対応し、インダイレクション・コンテナはコレクション・マッピングに対応します。
TopLinkはプロキシ・インダイレクションをサポートしませんが、修正メソッドでuseProxyIndirection
メソッドを使用できます。
プロキシ・インダイレクションを使用するには、ユーザーのドメイン・モデルが次の基準を満たす必要があります。
get()
メソッドおよびset()
メソッドはインタフェースを使用します。例5-3 プロキシ・インダイレクションの例
次のコードは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インタフェースを(Employee
とAddress
をそれぞれ)実装します。つまり、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);
Copyright © 1997, 2006, Oracle. All rights reserved.