この章では、TopLinkマッピングの構成方法について説明します。
表32-1は、構成可能なTopLinkマッピング・タイプと、そのタイプで対応している構成可能オプションが記載されたタイプ別の章への相互参照を示しています。
表32-2は、複数のTopLinkマッピング・タイプによって共有される構成可能オプションを示します。
詳細は、次を参照してください。
表32-2は、複数のTopLinkマッピング・タイプによって共有される構成可能オプションを示します。ここで説明する構成可能オプション以外にも、表32-1に示すように、特定のマッピングのタイプについて説明しているオプションも構成する必要があります。
表32-2 共通マッピング・オプション
オプション | タイプ | TopLink Workbench |
Java |
---|---|---|---|
|
基本 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
「プライベート・リレーションシップまたは独立したリレーションシップの構成」 |
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
|
|
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
読取り専用マッピングは、挿入、更新および削除の操作に影響を受けることはありません。
読取り専用マッピングは、オブジェクトにある複数の属性をデータベースの同じフィールドにマップするときに使用しますが、フィールドに書き込めるマッピングは1つのみです。
読取り専用マッピングを双方向の多対多マッピングで使用して、どのマッピングが多対多結合表を更新できるかを指定できます。
書込みロックまたはクラス・インジケータ・フィールドに対して定義されているマッピングは、読取り専用にする必要があります。ただし、書込みロックがキャッシュに格納されないように構成されている場合、またはクラス・インジケータが主キーの一部である場合を除きます。
読取り専用マッピングは、ディスクリプタの特定のマッピングが読取り専用の場合にのみ使用します。ディスクリプタ全体が読取り専用の場合、ディスクリプタ・レベルの設定を使用します(「読取り専用ディスクリプタの構成」を参照)。
表32-3は、どのマッピングがこのオプションをサポートしているかを示します。
マッピングを読取り専用として指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次のDatabaseMapping
メソッドを使用して、マッピングの読取りアクセスを構成します。
readOnly
: マッピング読取りアクセスを読取り専用に構成します。
readWrite
: マッピング読取りアクセスを読取りおよび書込みに構成します(デフォルト)。
例32-1では、phones
という名前の読取り専用属性を持つクラスでこれらのメソッドを使用する方法が示されています。
デフォルトでは、TopLinkで永続オブジェクトを取得すると、それによって参照先の依存オブジェクトがすべて取得されます。インダイレクションをリレーションシップ・マッピングでマップされた属性に対して有効にすると、TopLinkでは、参照されたオブジェクトのプレースホルダとしてインダイレクション・オブジェクトが使用されます。つまり、TopLinkでは、当該の指定属性にアクセスするまで、依存オブジェクトの読取りは遅延されます。これにより、特にアプリケーションが取得したオブジェクトのコンテンツのみを必要とし、そのオブジェクトが参照するオブジェクトのコンテンツは必要としない場合に、パフォーマンスの大幅な向上が見られます。
すべてのリレーションシップ・マッピングに対してインダイレクションを使用することをお薦めします。これにより、データ・ソースへのアクセスを最適化できるのみでなく、作業ユニット処理、キャッシュ・アクセスおよび同時実行性のTopLinkによる最適化が可能になります。
表32-4では、どのマッピングがこのオプションをサポートしているかを示します。
表32-4 マッピングによるインダイレクションのサポート
マッピング | ValueHolderインダイレクション |
透過インダイレクト・コンテナ・インダイレクション |
プロキシ・インダイレクション |
TopLink Workbenchの使用 |
Javaの使用 |
---|---|---|---|---|---|
|
|||||
|
|
|
|
![]() |
|
|
|
|
![]() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![]() |
![]() |
|
|
|
|
|
|
|
|
|
|
![]() |
|
|
|
|||||
|
|
|
|
![]() |
|
|
|
|
|
![]() |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
![]() |
![]() |
|
一般に、1対1マッピングにはValueHolderインダイレクション(「ValueHolderインダイレクション」を参照)を、コレクション・マッピングには透過インダイレクト・コンテナ・インダイレクション(「透過インダイレクト・コンテナ・インダイレクション」を参照)を使用することをお薦めします。トランスフォーメーションの実行がリソースに負荷のかかるタスク(リレーショナル・プロジェクトでのデータベースへのアクセスなど)の場合、トランスフォーメーション・マッピングに対してインダイレクションを有効にします。
EJBでインダイレクションを使用する場合、使用するEJBのバージョンおよびアプリケーション・サーバーが、インダイレクションの構成方法および適用するインダイレクションのタイプの決定に影響します(「インダイレクションおよびEJB」を参照)。
アプリケーションのシリアライズ対象となるオブジェクトにインダイレクションを使用する場合、デシリアライズ時にトリガーされないインダイレクション・オブジェクトの影響を検討する必要があります(「インダイレクション、シリアライズおよびデタッチ」を参照)。
詳細は、「インダイレクション」を参照してください。
インダイレクション・オプションは、マッピングの「一般」タブで、次の手順に従って指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の情報を参照し、タブのインダイレクションのフィールドを指定します。
フィールド | 説明 |
---|---|
インダイレクションの使用 | このマッピングがインダイレクションを使用する場合に指定します。 |
ValueHolder | マッピングがValueHolderインダイレクションを使用する場合に指定します。詳細は、「ValueHolderインダイレクション」を参照してください。 |
プロキシ | マッピングがプロキシ・インダイレクションを使用する場合に指定します。詳細は、「プロキシ・インダイレクション」を参照してください。 |
Java APIを介してマッピングを作成すると、すべての外部参照マッピングでは、ValueHolderインダイレクションの使用がデフォルトとなり、すべてのトランスフォーメーション・マッピングでは、インダイレクションの非使用がデフォルトとなります。
インダイレクションを無効にするには、ForeignReferenceMapping
メソッドdontUseIndirection
を使用します。
ValuHolderインダイレクションを有効にするには、ForeignReferenceMapping
メソッドuseBasicIndirection
を使用します。
透過コンテナ・インダイレクションを有効にするには、次のいずれかのCollectionMapping
メソッドを使用します。
useTransparentCollection
useTransparentList
useTransparentMap
useTransparentSet
プロキシ・インダイレクションを有効にするには、ObjectReferenceMapping
メソッドuseProxyIndirection
を使用します。
さらに、この項では、次の内容について説明します。
oracle.toplink.mappings.ForeignReferenceMapping
およびoracle.toplink.mappings.foundation.AbstractTransformationMapping
のインスタンスには、useBasicIndirection
メソッドがあり、oracle.toplink.indirection.ValueHolderInterface
を使用してコーディングする属性への、それと実際のオブジェクトの間でのマッピングを構成できます。
属性がCollection
タイプ(Vector
など)の場合は、IndirectContainer
(「IndirectContainerインダイレクションの構成」を参照)を使用したり、次のようにコンストラクタ内にValueHolder
を定義することも可能です。
addresses = new ValueHolder(new Vector());
例32-2は、ValueHolder
インダイレクションを使用するEmployee
クラスの例を示しています。このクラス定義では、既存のgetterおよびsetterメソッド内でのValueHolderの使用は隠されています。
例32-2 ValueHolderインダイレクションを使用するクラス
public class Employee {
protected ValueHolderInterface address;
// Initialize ValueHolders in constructor
public Employee() {
address = new ValueHolder();
}
public Address getAddress() {
return (Address) this.addressHolder.getValue();
}
public void setAddress(Address address) {
this.addressHolder.setValue(address);
}
}
例32-3は、address
属性への1対1マッピングの構成方法を示しています。
例32-3 ValueHolderインダイレクションを使用するマッピング
OneToOneMapping mapping = new OneToOneMapping(); mapping.useBasicIndirection(); mapping.setReferenceClass(Employee.class); mapping.setAttributeName("address");
アプリケーションは、Employee
メソッドgetAddress
およびsetAddress
を使用して、Address
オブジェクトにアクセスします。基本インダイレクションが有効になっているため、TopLinkは、永続フィールドがタイプValueHolderInterface
であるものと予期します。
ValueHolder
インダイレクションをメソッド・アクセス(「メソッド・アクセスの構成」を参照)とともに使用している場合、Javaコード内の属性タイプをValueHolderInterface
に変更することに加え、2対のgetterおよびsetterメソッドをTopLinkに提供することも必要です。
マッピングに登録されTopLinkでのみ使用されるIndirectionオブジェクトのgetterおよびsetter。すなわち、ValueHolderInterface
に一致したインスタンスを戻すget
メソッドと、同じインタフェースに一致した1つの引数を受け入れるset
メソッドです。
アプリケーションにより使用される実際の属性値のgetterとsetter。
例32-4は、メソッド・アクセスとともにValueHolder
インダイレクションを使用したEmployee
クラスの例を示しています。このクラスの定義では、Employee
のaddress
属性がAddress
からValueHolderInterface
に変更されています。また、適切なgetterおよびsetterメソッドを指定しています。
例32-4 メソッド・アクセスとともにValueHolderインダイレクションを使用したクラス
public class Employee { protected ValueHolderInterface address; // Initialize ValueHolders in constructor public Employee() { address = new ValueHolder(); } // getter and setter registered with the mapping and used only by TopLink public ValueHolderInterface getAddressHolder() { return address; } public void setAddressHolder(ValueHolderInterface holder) { address = holder; } // getter and setter methods used by the application to access the attribute public Address getAddress() { return (Address) address.getValue(); } public void setAddress(Address theAddress) { address.setValue(theAddress); } }
例32-5は、address
属性への1対1マッピングの構成方法を示しています。
例32-5 メソッド・アクセスとともにValueHolderインダイレクションを使用したマッピング
OneToOneMapping mapping = new OneToOneMapping(); mapping.useBasicIndirection(); mapping.setReferenceClass(Employee.class); mapping.setAttributeName("address"); mapping.setGetMethodName("getAddressHolder"); mapping.setSetMethodName("setAddressHolder");
アプリケーションは、Employee
メソッドgetAddress
およびsetAddress
を使用して、Address
オブジェクトにアクセスします。基本インダイレクションが有効になっているため、TopLinkは、Employee
のインスタンスで永続化操作を実行する際、Employee
メソッドgetAddressHolder
およびsetAddressHolder
を使用します。
OC4JでEJB 3.0の永続性を使用しながら(「インダイレクションおよびEJB」を参照)インダイレクションを使用している際に、アプリケーションでインダイレクション対応Enterprise Bean(「インダイレクション、シリアライズおよびデタッチ」を参照)をシリアライズする場合は、次のようにして、OC4Jが使用するのと同じJavaエージェントを使用するようにクライアントを構成します。これにより、デシリアライズでトリガーされないインダイレクション・オブジェクトが保持されます。
クライアントのクラスパスに、<
TOPLINK_HOME
>\jlib
にある次のJARファイルを含めてください。
toplink.jar
toplink-agent.jar
asm.jar
asm-util.jar
ejb3-toplink-session.xml
(およびこのファイルが参照するすべてのプロジェクト・デプロイXML)
クライアントの起動に使用するJavaコマンドラインに次の引数を追加します。
-javaagent:toplink-agent.jar
oracle.toplink.mappings.ForeignReferenceMapping
およびoracle.toplink.mappings.foundation.AbstractTransformationMapping
のインスタンスには、useContainerIndirection
メソッドがあり、oracle.toplink.indirection.IndirectContainer
を使用してコーディングする属性への、それと実際のオブジェクトの間でのマッピングを構成できます。
IndirectContainer
を使用すると、java.util.Collection
クラスは、TopLinkのインダイレクション・オブジェクトとして動作できます。つまり、java.util.Collection
は、必要な場合(通常は、Collection
へのアクセッサが起動されたとき)に、データベース内のTopLinkの内容の読取りのみを行います。IndirectContainer
を使用しない場合に、Collection
属性へのアクセスを行うには、Collection
のすべてのメンバーの取得が必要になります。
例32-6は、メソッド・アクセスとともにIndirectContainer
インダイレクションを使用したEmployee
クラスの例を示しています。このクラスの定義では、Employee
のaddresses
属性がAddresses
からIndirectContainer
に変更されています。また、適切なgetterおよびsetterメソッドを指定しています。この例では、addresses
がjava.util.List
であるため、oracle.toplink.indirection.IndirectList
のインスタンスが使用されます。
例32-6 IndirectContainerインダイレクションを使用するクラス
public class Employee { protected IndirectList addresses; // Initialize ValueHolders in constructor public Employee() { addresses = new IndirectList(); } // getter and setter methods registered with the mapping and used by TopLink public ValueHolderInterface getAddressesHolder() { return addresses.getValueHolder(); } public void setAddressesHolder(ValueHolderInterface holder) { addresses = addresses.setValueHolder(holder); } // getter and setter methods used by the application to access the attribute public List getAddresses() { return (List) addresses.getValue(); } public void setAddresses(List newAddresses) { addresses.removeAll(); addresses.addAll(newAddresses); } }
例32-7は、addresses
属性への1対1マッピングの構成方法を示しています。
例32-7 IndirectContainerインダイレクションを使用するマッピング
OneToOneMapping mapping = new OneToOneMapping(); mapping.useBasicIndirection(); mapping.setReferenceClass(Employee.class); mapping.setAttributeName("addresses"); mapping.setGetMethodName("getAddressesHolder"); mapping.setSetMethodName("setAddressesHolder");
例32-8は、Employee
からAddress
への1対1リレーションシップの例を示しています。
例32-8 プロキシ・インダイレクションの例
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; . . . }
例32-8では、EmployeeImpl
およびAddressImpl
クラスの両方が、パブリック・インタフェース(それぞれ、Employee
およびAddress
)を実装しています。ここで、AddressImpl
クラスが1対1リレーションシップのターゲットであるため、インタフェースの実装が必要なクラスはAddressImpl
クラスのみです。ところが、EmployeeImpl
が透過インダイレクションを使用した別の1対1リレーションシップのターゲットとなっている場合は、次の例に示すように、EmployeeImpl
クラスもインタフェースを実装する必要があります。
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);
TopLinkでは、XPath文を使用してJavaオブジェクトの属性をXML文書の場所にマップします。XMLレコードを使用してXMLマッピングまたはEISマッピングを作成する場合、次のいずれかに基づいてXPathを指定できます。
名前
位置
パスおよび名前
表32-5は、どのマッピングがこのオプションをサポートしているかを示します。
脚注1 XMLレコードの使用時のみ(「レコード形式の構成」を参照)。
脚注2 自己XPath(".")をサポートします。これにより、TopLinkランタイムは、すべての読取りと書込み操作を親の要素の内部にネストされた要素ではなく、親の要素で実行できるようになります(「マッピングおよびjaxb:classのカスタマイズ」を参照)。
マッピング用にXPathを選択するには、ディスクリプタとスキーマ・コンテキストを関連付けておく必要があります(「EISディスクリプタのスキーマ・コンテキストの構成」または「XMLディスクリプタのスキーマ・コンテキストの構成」を参照)。
詳細は、「マッピングとXPath」を参照してください。
前述の表を使用して、XMLレコードを使用したXMLマッピングまたはEISマッピングのためのXPathを選択します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
必要に応じて、「一般」タブをクリックします。「一般」タブが表示されます。
「参照」をクリックして、この属性にマップするXPathを選択します(「XPathの選択」を参照)。
XMLレコードを使用したEISコンポジット・オブジェクト・マッピングまたはXMLコンポジット・オブジェクト・マッピングでは、次のいずれかを選択できます。
XPathの指定: この属性にマップするXPathを選択します(「XPathの選択」を参照)。
親要素に集約: 自己XPath("."
)(「自己XPath」を参照)を選択します。これにより、TopLinkランタイムは、すべての読取りと書込み操作を親の要素の内部にネストされた要素ではなく、親の要素で実行できるようになります(「マッピングおよびjaxb:classのカスタマイズ」を参照)。
「XPathの選択」ダイアログ・ボックスから、XPathを選択して「OK」をクリックします。TopLink Workbenchにより、完全なXPath名が作成されます。
デフォルトのNULL値は、TopLinkが、NULL
値をデータ・ソースから読み取ったときにNULL
のかわりに使用する、JavaのObject
タイプおよび値です。
デフォルトのNULL値をマッピング・レベルで構成すると、TopLinkはこの値を使用して双方向で変換を行います。
TopLinkは、データ・ソースからNULL
を読み取る場合、このNULL
を指定されたタイプおよび値に変換します。
TopLinkは、データ・ソースへの書込みや問合せを行う場合、指定されたタイプおよび値を再びNULL
に変換します。
表32-6は、どのマッピングがこのオプションをサポートしているかを示します。
注意: デフォルトのNULL値は、Object である必要があります。プリミティブ値(int など)を指定するには、対応するObject ラッパー(Integer など)を使用する必要があります。 |
TopLinkを使用して、セッションで使用されるすべてのマッピングにデフォルトのNULL値を設定することもできます(「ログイン・レベルでのデフォルトのNULL値の構成」を参照)。
マッピングにデフォルトのNULL値を構成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の情報を参照し、このタブで「デフォルトのNULL値」フィールドを指定します。
フィールド | 説明 |
---|---|
デフォルトのNULL値 | データ・ソースがNULL の場合に、このマッピングにデフォルト値を含めるかどうかを指定します。選択した場合、デフォルトの「タイプ」と「値」を入力する必要があります。 |
タイプ | デフォルト値のJavaタイプを選択します。 |
値 | デフォルト値を入力します。 |
Java APIを使用してマッピングNULL値を構成するには、AbstractDirectMapping
メソッドsetNullValue
を使用します。
例:
// Defaults a null salary to 0
salaryMapping.setNullValue(new Integer(0));
デフォルトでは、TopLinkは直接アクセスを使用してpublic属性にアクセスします。あるいは、オブジェクトの属性をデータベースに書き込むとき、またはデータベースからオブジェクトの属性を読み取るときに、getterおよびsetterメソッドを使用してオブジェクトの属性にアクセスすることもできます。これは、メソッド・アクセスと呼ばれます。
属性の可視性(public、protected、privateまたはパッケージの可視性)およびサポートされているJDKのバージョンに応じて、使用できるアクセスのタイプが制限されることがあります。
private、protectedまたはパッケージの各変数あるいはメソッド・アクセスを使用するには、Javaリフレクションのセキュリティ設定を有効にする必要があります。ほとんどのアプリケーション・サーバーでは、これはデフォルトで有効になっていますが(「セキュリティ・パーミッション」を参照)、一定のJVM構成では明示的に有効にする必要があります。必要な場合、java.policy
ファイルを使用して、ReflectPermission
をアプリケーション全体またはアプリケーションのコードベースに付与します。次に例を示します。
grant{ permission java.lang.reflect.ReflectPermission; };
オブジェクトの作成時に、パフォーマンスを向上させ、アプリケーション固有の動作を実行できないようにするには、直接アクセスを可能なかぎり使用することをお薦めします。
表32-7は、どのマッピングがこのオプションをサポートしているかを示します。
プロジェクト・レベルでのメソッド・アクセスの構成に関する詳細は、「プロジェクト・レベルでのマッピングされたフィールド・アクセスの構成」を参照してください。
マッピングのフィールド・アクセス・メソッドを指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の情報を参照し、このタブの「メソッド・アクセス」フィールドを指定します。
フィールド | 説明 |
---|---|
メソッド・アクセス | このマッピングがpublic属性に直接アクセスするかわりに特定のアクセッサ・メソッドを使用するかどうかを指定します。デフォルトでは、このオプションは選択されていません(つまり、マッピングは直接アクセスを使用します)。 |
getメソッド | 特定のget メソッドを選択します。 |
setメソッド | 特定のset メソッドを選択します。 |
新しいすべてのマッピングで使用されるデフォルトのアクセス・タイプを変更するには、プロジェクトのエディタ・ウィンドウで「デフォルト」タブを使用します。詳細は、「プロジェクト・レベルでのマッピングされたフィールド・アクセスの構成」を参照してください。
次のDatabaseMapping
メソッドを使用して、TopLinkがマップ済属性へのアクセスに使用するユーザー定義のgetterおよびsetterを構成します。
TopLink Workbenchでサポートされていないマッピングに関しては、属性に直接アクセスするかわりに、ユーザー定義のメソッドを介して属性にアクセスするため、setGetMethodName
およびsetSetMethodName
メソッドを使用します。
setGetMethodName
: マップ済属性を取得するために、ユーザー定義メソッドのString
名を設定します。
setSetMethodName
: マップ済属性を設定するために、ユーザー定義メソッドのString
名を設定します。
例32-9では、オブジェクト・リレーショナル・マッピングで属性phones
およびアクセッサ・メソッドgetPhones
とsetPhones
を持つクラスでこれらのメソッドを使用する方法が示されています。
TopLinkでは、オブジェクト・リレーションシップはプライベート型にも独立型にもできます。
プライベート・リレーションシップでは、ターゲット・オブジェクトは、ソース・オブジェクトのプライベート・コンポーネントです。ターゲット・オブジェクトは、ソースなしで存在できず、ソース・オブジェクトを介してのみアクセスできます。ソース・オブジェクトを破棄することは、ターゲット・オブジェクトを破棄することにもなります。
独立したリレーションシップでは、ソースおよびターゲットのオブジェクトは、独立して存在するパブリック・オブジェクトです。一方のオブジェクトを破棄したからといって他方のオブジェクトが破棄されることはありません。
ヒント: TopLinkは、プライベート・リレーションシップを自動的に管理します。オブジェクトがデータベースに書き込まれるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトもデータベースに書き込まれます。オブジェクトがデータベースから削除されるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトも削除されます。このことはアプリケーションの動作およびパフォーマンスの両方に影響を及ぼす可能性があるため、新しいシステムを作成するときは注意してください。 |
表32-8は、どのマッピングがこのオプションをサポートしているかを示します。
私有マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
私有を作成するには、「私有」オプションを選択します。
TopLink Workbenchでサポートされていないマッピングに対しては、independentRelationship
(デフォルト)、privateOwnedRelationship
およびsetIsPrivateOwned
メソッドを使用します。
例32-10では、私有属性phones
を持つクラスでこれらのメソッドをマッピングに使用する方法が示されています。
マッピングごとに自由形式のテキスト・コメントを定義できます。これらのコメントは任意の用途に使用できます。たとえば、マッピングの目的または重要性など、プロジェクトの重要な実装詳細を記録することなどに使用できます。
コメントはTopLinkデプロイXMLファイルのTopLink Workbenchプロジェクトに格納されます。この機能に対応するJava APIはありません。
表32-9は、どのマッピングがこのオプションをサポートしているかを示します。
マッピングにコメントを追加するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
このマッピングを説明するコメントを入力します。
シリアライズ・オブジェクト・コンバータを使用して、任意のオブジェクトまたはオブジェクトのセットをデータ・ソースのバイナリ・ラージ・オブジェクト(BLOB)フィールドに格納できます。コンバータはJavaシリアライザを使用するため、ターゲットはシリアライズ可能である必要があります。
シリアライズ・オブジェクト・コンバータの詳細は、「シリアライズ・オブジェクト・コンバータ」を参照してください。
表32-10は、どのマッピングがこのオプションをサポートしているかを示します。
シリアライズ・オブジェクト・ダイレクト・マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
シリアライズ・オブジェクト・コンバータを指定するには、「シリアライズ・オブジェクト・コンバータ」オプションを選択します。
例32-11で示されているように、AbstractCompositeDirectCollectionMapping
メソッドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスにoracle.toplink.converters.SerializedObjectConverter
を設定できます。
例32-11 JavaでのSerializedObjectConverterの構成
// Create SerializedObjectConverter instance SerializedObjectConverter serializedObjectConvter = new SerializedObjectConverter(); // Set SerializedObjectConverter on ArrayMapping ArrayMapping arrayMapping = new ArrayMapping(); arrayMapping.setValueConverter(serializedObjectConvter); arrayMapping.setAttributeName("responsibilities"); arrayMapping.setStructureName("Responsibilities_t"); arrayMapping.setFieldName("RESPONSIBILITIES"); orDescriptor.addMapping(arrayMapping);
タイプ変換コンバータは、データ・ソース・タイプをJavaタイプに明示的にマップするために使用します。
タイプ変換コンバータの詳細は、「タイプ変換コンバータ」を参照してください。
表32-11は、どのマッピングがこのオプションをサポートしているかを示します。
タイプ変換ダイレクト・マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
「タイプ変換コンバータ」オプションを選択します。
次の情報を参照し、「コンバータ」タブで「タイプ変換コンバータ」のフィールドを指定します。
フィールド | 説明 |
---|---|
データ・タイプ | データ・ソースのデータのJavaタイプを選択します。 |
属性タイプ | Javaクラスの属性のJavaタイプを選択します。 |
例32-12で示されているように、AbstractCompositeDirectCollectionMapping
メッソドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスにoracle.toplink.converters.TypeConversionConverter
を設定できます。
例32-12 JavaでのTypeConversionConverterの構成
// Create TypeConversionConverter instance TypeConversionConverter typeConversionConverter = new TypeConversionConverter(); typeConversionConverter.setDataClass(); typeConversionConverter.setObjectClass(); // Set TypeConversionConverter on ArrayMapping ArrayMapping arrayMapping = new ArrayMapping(); arrayMapping.setValueConverter(typeConversionConverter); arrayMapping.setAttributeName("responsibilities"); arrayMapping.setStructureName("Responsibilities_t"); arrayMapping.setFieldName("RESPONSIBILITIES"); orDescriptor.addMapping(arrayMapping);
TypeConversionConverter
インスタンスの構成には、次のAPIが使用されています。
setDataClass(java.lang.Class dataClass)
: データ・タイプ・クラスを指定します。
setObjectClass(java.lang.Class objectClass)
: オブジェクト・タイプ・クラスを指定します。
オブジェクト・タイプ・コンバータは、一定数のデータ・ソースのデータ値をJavaオブジェクト値に対応させるために使用します。このコンバータは、データ・ソースにある値とJavaにある値が異なる場合に使用できます。
オブジェクト・タイプ・コンバータの詳細は、「オブジェクト・タイプ・コンバータ」を参照してください。
表32-12は、どのマッピングがこのオプションをサポートしているかを示します。
オブジェクト・タイプ・コンバータをダイレクト・マッピングに追加するには、次の手順を実行します。
ナビゲータでマッピングを選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
マッピングの「コンバータ」タブにある次のフィールドを使用して、オブジェクト・タイプ・コンバータのオプションを選択します。
フィールド | 説明 |
---|---|
データ・タイプ | データ・ソースのデータのJavaタイプを選択します。 |
属性タイプ | Javaクラスの属性のJavaタイプを選択します。 |
変換値 | 新しい変換値を追加するには、「追加」をクリックします。既存の変換値を変更するには、「編集」をクリックします。既存の変換値を削除するには、「削除」をクリックします。
選択した値をデフォルト値として指定するために使用します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。 |
データ値 | データ・ソースの属性の値を指定します。 |
属性値 | Javaクラスの属性の値を指定します。 |
デフォルト属性値 | 選択した値をデフォルト値として使用するかどうかを指定します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。 |
例32-13で示されているように、AbstractCompositeDirectCollectionMapping
メソッドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスにoracle.toplink.converters.ObjectTypeConverter
を設定できます。
例32-13 JavaでのObjectTypeConverterの構成
// Create ObjectTypeConverter instance ObjectTypeConverter objectTypeConvter = new ObjectTypeConverter(); objectTypeConverter.addConversionValue("F", "Female"); // Set ObjectTypeConverter on ArrayMapping ArrayMapping arrayMapping = new ArrayMapping(); arrayMapping.setValueConverter(objectTypeConverter); arrayMapping.setAttributeName("responsibilities"); arrayMapping.setStructureName("Responsibilities_t"); arrayMapping.setFieldName("RESPONSIBILITIES"); orDescriptor.addMapping(arrayMapping);
ObjectTypeConverter
インスタンスの構成には、次のAPIが使用されています。
addConversionValue(java.lang.Object fieldValue, java.lang.Object attributeValue)
: データ・タイプ値をオブジェクト・タイプ値に関連付けます。
addToAttributeOnlyConversionValue(java.lang.Object fieldValue, java.lang.Object attributeValue)
: 一方向変換値を追加します。
setDefaultAttributeValue(java.lang.Object defaultAttributeValue)
: デフォルト値を設定します。
シンプル・タイプ・トランスレータを使用すると、XML要素の値が、XMLスキーマで定義されているように、要素の<type>
属性に基づいて適切なJavaタイプに自動的に変換されます。シンプル・タイプ・トランスレータは、マッピングのXPathが要素を指定している場合にのみ使用できます。シンプル・タイプ・トランスレータは、マッピングのXPathが属性を指定している場合は使用できません。
詳細は、「シンプル・タイプ・トランスレータ」を参照してください。
表32-13では、どのマッピングがこのオプションをサポートしているかを示します。
この表を使用して、XMLスキーマからの要素を修飾します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「XMLスキーマの"type"属性を使用」フィールドを選択して、XMLスキーマからの要素を修飾します。
IDEでJavaコードを使用するシンプル・タイプ・トランスレータでXMLマッピングを作成するには、次の要素が必要です。
EISDirectMapping
、EISCompositeDirectCollectionMapping
、XMLDirectMapping
またはXMLCompositeDirectCollectionMapping
Converter
のインスタンス
TypedElementField
のインスタンス
例32-14は、TopLinkがByte
配列(ClassConstants.ABYTE
)をBase64
(XMLConstants.BASE64_BINARY
)でエンコードされた文字列として書き込めるように、XML作成用の組込み変換をオーバーライドするため、XMLDirectMapping
で独自のシンプル・タイプ・トランスレータを実装する方法を示しています。
例32-14 タイプ変換XMLマッピングの作成
XMLDirectMapping mapping = new XMLDirectMapping(); mapping.setConverter(new SerializedObjectConverter()); TypedElementField field = new TypedElementField("element"); field.getSimpleTypeTranslator().addJavaConversion( ClassConstants.ABYTE, new QName(XMLConstants.SCHEMA_URL, XMLConstants.BASE64_BINARY) ); mapping.setField(field);
JAXB型保証列挙コンバータを使用すると、XML要素の値が、XMLスキーマに定義された適切な型保証列挙値に自動的に変換されます。
詳細は、「マッピングおよびJAXB型保証列挙」を参照してください。
表32-14は、どのマッピングがこのオプションをサポートしているかを示します。
脚注1 XMLレコードの使用時のみ(「レコード形式の構成」を参照)。
TopLink Workbenchでは、JAXBTypesafeEnumConverter
を使用するマッピングの構成で、このコンバータを直接サポートしていないため、Javaを使用して修正メソッドを作成する必要があります(「Javaの使用」を参照)。
プロジェクトおよびオブジェクト・モデルをTopLink JAXBコンパイラを使用して作成する場合(「XMLスキーマからのXMLプロジェクトの作成」を参照)、コンパイラでは型保証列挙クラスおよびディスクリプタ修正メソッドのあるクラスが作成され、必須修正メソッドが自動的に登録されます(「DescriptorAfterLoadsクラスに対する型保証列挙コンバータの修正メソッド」を参照)。
JavaでJAXBTypesafeEnumConverter
を使用してマッピングを構成するには、ディスクリプタ修正メソッドを使用します(「修正メソッドの構成」を参照)。例32-15は、JAXBTypesafeEnumConverter
でXMLDirectMapping
を構成する修正メソッドの例を示しています。この例では、属性_Val
が、型保証クラスMyTypesafeEnum
に対応するJAXB型保証列挙にマップされます。
例32-15 JAXB型保証列挙XMLマッピングの作成
public class DescriptorAfterLoads { public static void amendRootImplDescriptor(ClassDescriptor descriptor) { DatabaseMapping _ValMapping = descriptor.getMappingForAttributeName("_Val"); JAXBTypesafeEnumConverter _ValConverter = new JAXBTypesafeEnumConverter(); ValConverter.setEnumClassName("MyTypesafeEnum"); ((XMLDirectMapping) _ValMapping).setConverter(_ValConverter); } }
コレクション・マッピング・コンテナ・ポリシーでは、TopLinkがデータベースからターゲット・オブジェクトを読み取る際に必ず使用する必要がある具象クラスを指定します。
コレクション・マッピングでは、java.util.List
、java.util.Set
、java.util.Collection
またはjava.util.Map
インタフェースを実装する任意の具象クラスを使用できます。List
、Set
、Collection
、Map
または、これらのインタフェースのサブインタフェースとして、あるいはこれらのインタフェースのうち1つを実装するクラスとして宣言されたオブジェクト属性をマップできます。
デフォルトでは、TopLinkランタイムは、これらのコンテナ・タイプごとに、oracle.toplink.indirection
パッケージに含まれる次の具象クラスを使用します。
List
: IndirectList
またはEJBIndirectList
Set
: IndirectSet
またはEJBIndirectSet
Collection
: IndirectList
またはEJBIndirectList
Map
: IndirectMap
またはEJBIndirectMap
あるいは、使用する具象コンテナ・クラスをマッピングに指定することもできます。TopLinkがコレクション・マッピングでマップされた属性を含むオブジェクトをデータベースから読み取ると、その属性は指定された具象クラスのインスタンスで設定されます。たとえば、TopLinkでは、メモリー内でソートしません。メモリー内でソートするには、デフォルトのSet
タイプ(IndirectList
)を具象コレクション・タイプとしてjava.util.TreeSet
でオーバーライドします。デフォルトでは、コレクション・マッピングのコンテナ・クラスは、java.util.Vector
です。
注意: TopLink Workbenchを使用し、デフォルトのCollection クラスを独自のカスタムCollection クラスでオーバーライドする場合、独自のカスタムCollection クラスをTopLink Workbenchのクラスパスに入れる必要があります(「TopLink Workbench環境の構成」を参照)。 |
表32-15は、どのマッピングがこのオプションをサポートしているかを示します。
マッピングのコンテナ・ポリシーを指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「詳細」ボタンをクリックします。「拡張コンテナ・オプション」が「一般」タブに表示されます。
「一般」タブの「拡張コンテナ・オプション」のフィールドを使用し、コンテナ・オプションを指定します。
フィールド脚注1 | 説明 |
---|---|
コンテナ・タイプ | 使用するCollection クラスのタイプを指定します。
|
デフォルト・クラスのオーバーライド | カスタム・クラスをマッピングのコンテナ・ポリシーとして使用することを指定します。「参照」をクリックして、異なるクラスを選択します。コンテナ・クラスには、java.util.Collection インタフェースを実装(直接的または間接的に)する必要があります。 |
キー・メソッド | 「コンテナ・タイプ」を「Map」として構成する場合、このオプションを使用してゼロ引数メソッドの名前を指定します。ターゲット・オブジェクトに対してコールされたこのメソッドの結果は、Hashtable またはMap でキーとして使用されます。このメソッドは、Hashtable またはMap で有効なキーとなるオブジェクトを返す必要があります。 |
脚注1 一部のマッピングでは、サポートされていないオプションがあります。詳細は、表32-15を参照してください。
oracle.toplink.mappings.ContainerMapping
インタフェースを実装するクラスには、コンテナ・ポリシーを設定する次のメソッドがあります。
useCollectionClass(java.lang.Class concreteClass)
: 指定されたjava.util.Collection
コンテナ・クラスのインスタンスを使用してターゲット・オブジェクトを保持するように、マッピングを構成します。
useMapClass(java.lang.Class concreteClass, java.lang.String methodName)
: 指定されたjava.util.Map
コンテナ・クラスのインスタンスを使用してターゲット・オブジェクトを保持するように、マッピングを構成します。Map
にある値の索引付けに使用されるキーは、指定されたゼロ引数メソッドをコールして返される値です。このメソッドは、Map
に挿入される任意の値のクラス(またはスーパークラス)により実装される必要があります。
oracle.toplink.mappings.CollectionMapping
(ContainerMapping
インタフェースを実装)を拡張したクラスにも、コンテナ・ポリシーを設定する次のメソッドがあります。
useSortedSetClass(java.lang.Class concreteClass, java.util.Comparator comparator)
: 指定されたjava.util.SortedSet
コンテナ・クラスのインスタンスを使用するようにマッピングを構成します。ターゲット・オブジェクトのソートに使用するComparator
を指定します。
例32-16は、ObjectArrayMapping
を構成してjava.util.ArrayList
コンテナ・クラスを使用する方法を示しています。
例32-16 オブジェクト配列マッピング
// Create a new mapping and register it with the source Object-relational descriptor
ObjectArrayMapping phonesMapping = new ObjectArrayMapping();
phonesMapping.setAttributeName("phones");
phonesMapping.setGetMethodName("getPhones");
phonesMapping.setSetMethodName("setPhones");
phonesMapping.setStructureName("PHONELIST_TYPE");
phonesMapping.setReferenceClass(Phone.class);
phonesMapping.setFieldName("PHONES");
phonesMapping.useCollectionClass(ArrayList.class);
orDescriptor.addMapping(phonesMapping);
トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマ(「フィールドとトランスフォーマの関連付けの構成」を参照)です。
この項では、読取り(アンマーシャリング)時にフィールドから属性へのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用する属性トランスフォーマを構成する方法について説明します。
メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。
メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非侵入型です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。
表32-16は、どのマッピングがこのオプションをサポートしているかを示します。
マッピングの属性トランスフォーマを指定するには、次の手順を実行します。
ナビゲータでトランスフォーメーション・マッピングを選択します。そのプロパティがエディタに表示されます。
「編集」をクリックします。「トランスフォーマの指定」ダイアログ・ボックスが表示されます。
次の情報を参照し、ダイアログ・ボックスの各フィールドにデータを入力し、「OK」をクリックします。
フィールド | 説明 |
---|---|
トランスフォーメーション・メソッドの使用 | トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。 |
トランスフォーマ・クラスの使用 | トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、TopLink Workbenchアプリケーションのクラスパスに含まれている必要があります。 |
メソッド・ベース属性トランスフォーマは、AbstractTransformationMapping
メソッドsetAttributeTransformation
を使用し、使用するドメイン・オブジェクト・メソッドの名前を渡すことで構成できます。
クラス・ベース属性トランスフォーマは、AbstractTransformationMapping
メソッドsetAttributeTransformer
を使用し、oracle.toplink.mappings.Transfomers.AttributeTransformer
のインスタンスを渡すことで構成できます。
AttributeTransformer
を作成するには、AttributeTransformerAdapter
を拡張すると便利です。
トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ(「属性トランスフォーマの構成」を参照)、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマです。
この項では、書込み(マーシャリング)時にオブジェクト属性からフィールドへのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用するフィールド・トランスフォーマを構成する方法について説明します。
メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。
メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非介入型です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。
表32-17は、どのマッピングがこのオプションをサポートしているかを示します。
次の手順を使用して、「オブジェクト -> Fieldメソッド」のフィールドを指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
図32-17 「トランスフォーメーション・マッピング」、「フィールドとトランスフォーマの関連付け」
新しい関連付けを追加するには、「追加」をクリックします。「フィールドとトランスフォーマの関連付けの指定」に進みます。
既存の関連付けを変更するには、「編集」をクリックします。「フィールドとトランスフォーマの関連付けの指定」に進みます。
既存の関連付けを削除するには、「削除」をクリックします。
トランスフォーメーション・マッピングのフィールドに実際に使用するトランスフォーメーション・メソッドまたはクラスを指定するには、次の手順を実行します。
「トランスフォーメーション・マッピング」、「フィールドとトランスフォーマの関連付け」から、「追加」または「編集」をクリックします。「フィールドとトランスフォーマの関連付けの指定」ダイアログ・ボックスが表示されます。
次の情報を参照し、ダイアログ・ボックスの各フィールドを指定します。
フィールド | 説明 |
---|---|
フィールド | このトランスフォーメーションの対象とするデータベース・フィールドを(ディスクリプタの関連表から)選択します。 |
トランスフォーマ | トランスフォーメーションを制御する方法として、次のいずれかを選択します。 |
トランスフォーメーション・メソッドの使用 | トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。 |
トランスフォーマ・クラスの使用 | トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、TopLink Workbenchアプリケーションのクラスパスに含まれている必要があります。 |
特定のトランスフォーメーション・メソッドを、ドメイン・オブジェクトまたはoracle.toplink.mappings.Transfomers.FieldTransformer
のインスタンスに指定できます(FieldTransformerAdapter
を拡張することもできます)。FieldTransformer
の使用は、非介入型です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。
メソッド・ベース・フィールド・トランスフォーマは、AbstractTransformationMapping
メソッドaddFieldTransformation
を使用し、使用するデータベース・フィールド名とドメイン・オブジェクト・メソッドの名前を渡すことで構成できます。
クラス・ベース・フィールド・トランスフォーマは、AbstractTransformationMapping
メソッドaddFieldTransformer
を使用し、データベース・フィールド名およびoracle.toplink.mappings.Transfomers.FieldTransformer
のインスタンスを渡すことで構成できます。
FieldTransformer
を作成するには、FieldTransformerAdapter
を拡張すると便利です。
ダイレクト・マッピングは、通常、String
またはInteger
など、可変でない単純な値をマップします。トランスフォーメーション・マッピングは、複数のデータベース・フィールド値をJavaクラスのインスタンスにマッピングするなど、複雑な可変オブジェクト値をマップすることもできます。
トランスフォーマ・マッピングが可変値をマップする場合、TopLinkは、作業ユニットで値をクローンし、比較する必要があります(「コピー・ポリシーの構成」を参照)。
デフォルトでは、TopLinkは、すべてのトランスフォーメーション・マッピングが可変であるものと想定しています。マッピングで可変でない単純な値をマップする場合は、IsMutableオプションをfalse
に構成すると、作業ユニットのパフォーマンスを向上できます。
表32-18は、どのマッピングがこのオプションをサポートしているかを示します。
この表を使用して「オブジェクト -> Fieldメソッド」フィールドを指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
デフォルトでは、「可変」オプションが、すべてのトランスフォーメーション・マッピングで選択されます。マッピングで、基本的で単純な値をマップする場合は、このオプションの選択を解除します。
リレーションシップの2つのクラスが1対1マッピングによって相互に参照する双方向リレーションシップがマッピングにある場合は、次のような外部キー情報を設定します。
マッピングの一方は、setForeignKeyFieldName
メソッドをコールする必要があります。
他方のマッピングは、setTargetForeignKeyFieldName
メソッドをコールする必要があります。
また、addForeignKeyFieldName
メソッドおよびaddTargetForeignKeyFieldName
メソッドをコールして、複合外部キー情報を設定することもできます。TopLinkによりインダイレクションはデフォルトで有効であるため、属性はValueHolderInterface
である必要があります。
表32-19は、どのマッピングがこのオプションをサポートしているかを示します。
マッピングに双方向リレーションシップを設定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の表に説明されているタブの各フィールドにデータを入力します。
フィールド | 説明 |
---|---|
双方向リレーションシップのメンテナンス | TopLinkでこのリレーショナル・マッピングに双方向のリンクを設定する場合に指定します。 |
リレーションシップ・パートナ | この双方向リレーションシップのためのリレーションシップ・パートナを(「参照ディスクリプタ」のマップ済属性のリストから)選択します。 |
表32-6にまとめられているXMLベース・マッピングでは、リスト値をマップする場合、マッピングでリストをアンマーシャリング(書込み)する際、<item>aaa bbb ccc</item>
のように1つのノードにするか、または次のように複数のノードにするかを構成できます。
<item>aaa</item> <item>bbb</item> <item>ccc</item>
表32-20は、どのマッピングがこのオプションをサポートしているかを示します。
脚注1 XMLレコードの使用時のみ(「レコード形式の構成」を参照)。
単独ノードを使用するようにマッピングを構成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
リスト値を単独ノード(<item>aaa bbb ccc</item>
など)にアンマーシャリング(書込み)するようにマッピングを構成するには、「単独ノードを使用」をクリックします。
デフォルトでは、マッピングはリスト値を別々のノードにアンマーシャリングします。
リスト値を単独ノードに書き込むようにマッピングを構成するには、AbstractCompositeDirectCollectionMapping
メソッドsetUsesSingleNode
にtrue
の値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、false
の値を渡します。
XMLField
を取得するマッピングでは、リスト値を単独ノードに書き込むようにマッピングを構成するには、XMLField
メソッドsetUsesSingleNode
にtrue
の値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、false
の値を渡します。例32-17は、このメソッドをXMLDirectMapping
で使用する方法を示しています。