この章では、複数のマッピング・タイプに共通のTopLinkマッピングのオプションを構成する方法について説明します。
この章の内容は次のとおりです。
表121-1は、構成可能なTopLinkマッピング・タイプと、そのタイプで対応している構成可能オプションが記載されたタイプ別の章への相互参照を示します。
表121-2は、複数のTopLinkマッピング・タイプによって共有される構成可能オプションを示します。
詳細は、次を参照してください。
表121-2は、複数のTopLinkマッピング・タイプによって共有される構成可能オプションを示します。ここで説明される構成可能オプション以外にも、表121-1に示すように、特定のマッピング・タイプ(17.1項「マッピングのタイプ」を参照)について説明しているオプションも構成する必要があります。
表121-2 共通マッピング・オプション
構成オプション | Oracle JDeveloper |
TopLink Workbench |
Java |
---|---|---|---|
読取り専用(121.2項「読取り専用マッピングの構成」を参照) |
|||
インダイレクション(遅延ロード)(121.3項「インダイレクション(遅延ロード)の構成」を参照) |
|||
XPath(121.4項「XPathの構成」を参照) |
|||
デフォルトのNULL値(121.5項「マッピング・レベルでのデフォルトのNULL値の構成」を参照) |
|||
メソッドまたは直接フィールド・アクセス(121.6項「マッピング・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照) |
|||
プライベート・リレーションシップまたは独立したリレーションシップ(121.7項「プライベート・リレーションシップまたは独立したリレーションシップの構成」を参照) |
|||
コメント(121.8項「マッピング・コメントの構成」を参照) |
|||
シリアライズ・オブジェクト・コンバータ(121.9項「シリアライズ・オブジェクト・コンバータの構成」を参照) |
|||
シリアライズ・タイプ変換コンバータ(121.10項「タイプ変換コンバータの構成」を参照) |
|||
オブジェクト・タイプ・コンバータ(121.11項「オブジェクト・タイプ・コンバータの構成」を参照) |
|||
シンプル・タイプ・トランスレータ(121.12項「シンプル・タイプ・トランスレータの構成」を参照) |
|||
JAXB型保証列挙コンバータ(121.13項「JAXB型保証列挙コンバータの構成」を参照) |
|
|
|
コンテナ・ポリシー(121.14項「コンテナ・ポリシーの構成」を参照) |
|||
属性トランスフォーマ(121.15項「属性トランスフォーマの構成」を参照) |
|||
フィールド・トランスフォーマ・アソシエーション(121.16項「フィールド・トランスフォーマ・アソシエーションの構成」を参照) |
|||
可変マッピング(121.17項「可変マッピングの構成」を参照) |
|||
双方向リレーションシップ(121.18項「双方向リレーションシップの構成」を参照) |
|||
単独ノードの使用(121.19項「単独ノードの使用の構成」を参照) |
|||
CDATAの使用(121.20項「CDATAの使用の構成」を参照) |
読取り専用マッピングは、挿入、更新および削除の操作に影響を受けることはありません。
読取り専用マッピングは、オブジェクトにある複数の属性をデータベースの同じフィールドにマップするときに使用しますが、フィールドに書き込めるマッピングは1つのみです。
読取り専用マッピングを双方向の多対多マッピングで使用して、どのマッピングが多対多結合表を更新できるかを指定できます。
書込みロックまたはクラス・インジケータ・フィールドに対して定義されているマッピングは、読取り専用にする必要があります。ただし、書込みロックがキャッシュに格納されないように構成されている場合、またはクラス・インジケータが主キーの一部である場合を除きます。
読取り専用マッピングは、ディスクリプタの特定のマッピングが読取り専用の場合にのみ使用します。ディスクリプタ全体が読取り専用の場合、ディスクリプタ・レベルの設定を使用します(119.3項「読取り専用ディスクリプタの構成」を参照)。
注意: 読取り専用マッピングはデータベースに書き込まれませんが、TopLinkキャッシュにマージされます。 |
表121-3では、どのマッピングがこのオプションをサポートしているかを示します。
表121-3 マッピングによる読取り専用のサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用した読取り専用マッピングの構成方法 |
Javaを使用した読取り専用マッピングの構成方法 |
---|---|---|---|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
マッピングを読取り専用として指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次のDatabaseMapping
メソッドを使用して、マッピングの読取りアクセスを構成します。
readOnly
: マッピング読取りアクセスを読取り専用に構成します。
readWrite
: マッピング読取りアクセスを読取りおよび書込みに構成します(デフォルト)。
例121-1は、phones
という名前の読取り専用属性を持つクラスでこれらのメソッドを使用する方法を示します。
インダイレクションが有効になっていない場合は、TopLinkで永続オブジェクトを取得すると、それによって参照先の依存オブジェクトがすべて取得されます。インダイレクション(遅延ロード)をリレーションシップ・マッピングでマップされた属性に対して有効にすると、TopLinkでは、参照されたオブジェクトのプレースホルダとしてインダイレクション・オブジェクトが使用されます。つまり、TopLinkでは、当該の指定属性にアクセスするまで、依存オブジェクトの読取りは遅延されます。これにより、特にアプリケーションが取得したオブジェクトのコンテンツのみを必要とし、そのオブジェクトが参照するオブジェクトのコンテンツは必要としない場合に、パフォーマンスの大幅な向上が見られます。
すべてのリレーションシップ・マッピングに対してインダイレクションを使用することをお薦めします。これにより、データ・ソースへのアクセスを最適化できるのみでなく、作業ユニット処理、キャッシュ・アクセスおよび同時実行性のTopLinkによる最適化が可能になります。
表121-4では、どのマッピングがこのオプションをサポートしているかを示します。
表121-4 マッピングによるインダイレクションのサポート
一般に、1対1マッピングにはValueHolderインダイレクションを、コレクション・マッピングには透過インダイレクト・コンテナ・インダイレクションを使用することをお薦めします。トランスフォーメーションの実行がリソースに負荷のかかるタスク(リレーショナル・プロジェクトでのデータベースへのアクセスなど)の場合、トランスフォーメーション・マッピングに対してインダイレクションを有効にします。
EJBでインダイレクションを使用する場合、使用するEJBのバージョンおよびアプリケーション・サーバーが、インダイレクションの構成方法および適用するインダイレクションのタイプの決定に影響します。
アプリケーションのシリアライズ対象となるオブジェクトにインダイレクションを使用する場合、デシリアライズ時にトリガーされないインダイレクション・オブジェクトの影響を検討する必要があります。
ウィービング用に構成したJPAエンティティまたはPOJOクラスの場合、TopLinkでは、1対1マッピングのValueHolderインダイレクションのウィービングが実行されます。アプリケーションにコレクション・マッピング(1対多または多対多)が含まれている場合にTopLinkで変更追跡に対するウィービングが実行されるようにするには、すべてのコレクション・マッピングに対し、透過インダイレクト・コンテナ・インダイレクションのみが使用されるように構成する必要があります(コレクション・マッピングは、即時ロードやValueHolderインダイレクションが使用されるようには構成できません)。
詳細は、次を参照してください。
『EclipseLink Developer's Guide』の「Using EclipseLink JPA Weaving」(http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Weaving
)
インダイレクション・オプションは、マッピングの「一般」タブで、次の手順に従って指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の情報を参照し、タブのインダイレクションのフィールドを指定します。
フィールド | 説明 |
---|---|
インダイレクションの使用 | このマッピングがインダイレクションを使用する場合に指定します。 |
ValueHolder | マッピングがValueHolderインダイレクションを使用する場合に指定します。詳細は、17.2.4.1項「ValueHolderインダイレクション」を参照してください。 |
プロキシ | マッピングがプロキシ・インダイレクションを使用する場合に指定します。詳細は、 17.2.4.3項「プロキシ・インダイレクション」を参照してください。 |
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
(121.3.2.4項「IndirectContainerインダイレクションの構成」を参照)を使用したり、次のようにコンストラクタ内にValueHolder
を定義することも可能です。
addresses = new ValueHolder(new Vector());
例121-2は、ValueHolder
インダイレクションを使用するEmployee
クラスの例を示します。このクラス定義では、既存のgetterおよびsetterメソッド内でのValueHolderの使用は隠されています。
例121-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);
}
}
例121-3は、address
属性への1対1マッピングの構成方法を示します。
例121-3 ValueHolderインダイレクションを使用するマッピング
OneToOneMapping mapping = new OneToOneMapping(); mapping.useBasicIndirection(); mapping.setReferenceClass(Employee.class); mapping.setAttributeName("address");
アプリケーションは、Employee
メソッドgetAddress
およびsetAddress
を使用して、Address
オブジェクトにアクセスします。基本インダイレクションが有効になっているため、TopLinkは、永続フィールドがタイプValueHolderInterface
であるものと予期します。
ValueHolder
インダイレクションをメソッド・アクセス(121.6項「マッピング・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照)とともに使用している場合、Javaコード内の属性タイプをValueHolderInterface
に変更することに加え、2対のgetterおよびsetterメソッドをTopLinkに提供することも必要です。
マッピングに登録されTopLinkでのみ使用されるIndirectionオブジェクトのgetterおよびsetter。すなわち、ValueHolderInterface
に一致したインスタンスを戻すget
メソッドと、同じインタフェースに一致した1つの引数を受け入れるset
メソッドです。
アプリケーションにより使用される実際の属性値のgetterとsetter。
例121-4は、メソッド・アクセスとともにValueHolder
インダイレクションを使用したEmployee
クラスの例を示します。このクラスの定義では、Employee
のaddress
属性がAddress
からValueHolderInterface
に変更されています。また、適切なgetterおよびsetterメソッドを指定しています。
例121-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); } }
例121-5は、address
属性への1対1マッピングの構成方法を示します。
例121-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
を使用します。
JPAを使用しながらインダイレクションを使用している際に、アプリケーションでインダイレクション対応(遅延ロード)エンティティをシリアライズする場合(17.2.4.7項「インダイレクション、シリアライズおよびデタッチ」を参照)は、次のようにしてTopLinkエージェントを使用するようにクライアントを構成します。これにより、デシリアライズでトリガーされないインダイレクション・オブジェクトが保持されます。
クライアントのクラスパスに、<
TOPLINK_HOME
>\jlib
にある次のJARファイルを含めてください。
toplink.jar
<your-application-persistence>
.jar
クライアントの起動に使用するJavaコマンドラインに次の引数を追加します。
-javaagent:toplink.jar
静的ウィービングを使用することもできます(『EclipseLink Developer's Guide』の「How to Configure Static Weaving for JPA Entities」(http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#How_to_Configure_Static_Weaving_for_JPA_Entities
)を参照)。これにより、より適切なエラー・メッセージが表示され、マージの問題が解決されます。
注意: 静的ウィービングを使用してもシリアライズには影響を与えません。静的ウィービングを有効にしていなくても機能するためです。 |
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
のすべてのメンバーの取得が必要になります。
例121-6は、メソッド・アクセスとともにIndirectContainer
インダイレクションを使用したEmployee
クラスの例を示します。インダイレクションの使用は透過です。
例121-6 IndirectContainerインダイレクションを使用するクラス
public class Employee { protected List addresses; public Employee() { this.addresses = new ArrayList(); } public List getAddresses() { return this.addresses; } public void setAddresses(List addresses) { this.addresses = addresses; } }
例121-7は、addresses
属性への1対1マッピングの構成方法を示します。
例121-8は、Employee
からAddress
への1対1リレーションシップの例を示します。
例121-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; . . . }
例121-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);
例121-9は、Employee
からAddress
への1対1リレーションシップ・マッピングの例を示します。
TopLinkでは、XPath文を使用してJavaオブジェクトの属性をXML文書の場所にマップします。XMLレコードを使用してXMLマッピングまたはEISマッピングを作成する場合、次のいずれかに基づいてXPathを指定できます。
名前
位置
パスおよび名前
表121-5では、どのマッピングがこのオプションをサポートしているかを示します。
脚注1 XMLレコードの使用時のみ(76.4項「レコード形式の構成」を参照)。
脚注2 自己XPath(".")をサポートします。これにより、TopLinkランタイムは、すべての読取りと書込み操作を親の要素の内部にネストされた要素ではなく、親の要素で実行できるようになります(17.2.9項「マッピングおよびjaxb:classカスタマイズ」を参照)。
マッピング用にXPathを選択するには、ディスクリプタとスキーマ・コンテキストを関連付けておく必要があります(76.2項「EISディスクリプタのスキーマ・コンテキストの構成」または52.2項「XMLディスクリプタのスキーマ・コンテキストの構成」を参照)。
詳細は、17.2.7項「マッピングとXPath」を参照してください。
前述の表を使用して、XMLレコードを使用したXMLマッピングまたはEISマッピングのためのXPathを選択します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
必要に応じて、「一般」タブをクリックします。「一般」タブが表示されます。
「参照」をクリックして、この属性にマップするXPathを選択します(121.4.1.1項「XPathの選択」を参照)。
XMLレコードを使用したEISコンポジット・オブジェクト・マッピングまたはXMLコンポジット・オブジェクト・マッピングでは、次のいずれかを選択できます。
XPathの指定: この属性にマップするXPathを選択します(121.4.1.1項「XPathの選択」を参照)。
親要素に集約: 自己XPath("."
)(17.2.7.4項「自己XPath」を参照)を選択します。これにより、TopLinkランタイムは、すべての読取りと書込み操作を親の要素の内部にネストされた要素ではなく、親の要素で実行できるようになります(17.2.9項「マッピングおよびjaxb:classカスタマイズ」を参照)。
「XPathの選択」ダイアログ・ボックスから、XPathを選択して「OK」をクリックします。TopLink Workbenchにより、完全なXPath名が作成されます。
デフォルトのNULL値は、TopLinkが、NULL
値をデータ・ソースから読み取ったときにNULL
のかわりに使用する、JavaのObject
タイプおよび値です。
デフォルトのNULL値をマッピング・レベルで構成すると、TopLinkはこの値を使用して次の双方向で変換を行います。
TopLinkは、データ・ソースからNULL
を読み取る場合、このNULL
を指定されたタイプおよび値に変換します。
TopLinkは、データ・ソースへの書込みや問合せを行う場合、指定されたタイプおよび値を再びNULL
に変換します。
表121-6では、どのマッピングがこのオプションをサポートしているかを示します。
表121-6 マッピングによるデフォルトのNULL値のサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したマッピング・レベルでのデフォルトのNULL値の構成方法 |
Javaを使用したマッピング・レベルでのデフォルトのNULL値の構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意: デフォルトのNULL値は、Object である必要があります。プリミティブ値(int など)を指定するには、対応するObject ラッパー(Integer など)を使用する必要があります。 |
TopLinkを使用して、セッションで使用されるすべてのマッピングにデフォルトのNULL値を設定することもできます(97.6項「ログイン・レベルでのデフォルトの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メソッドを使用してオブジェクトの属性にアクセスすることもできます。これは、メソッド・アクセスと呼ばれます。
private、protectedまたはパッケージの各変数あるいはメソッド・アクセスを使用するには、Javaリフレクションのセキュリティ設定を有効にする必要があります。ほとんどのアプリケーション・サーバーでは、これはデフォルトで有効になっていますが(8.2.3項「セキュリティ・パーミッションの設定方法」を参照)、一定のJVM構成では明示的に有効にする必要があります。必要な場合、java.policy
ファイルを使用して、ReflectPermission
をアプリケーション全体またはアプリケーションのコードベースに付与します。次に例を示します。
grant{ permission java.lang.reflect.ReflectPermission; };
オブジェクトの作成時に、パフォーマンスを向上させ、アプリケーション固有の動作を実行できないようにするには、直接アクセスを可能なかぎり使用することをお薦めします。
表121-7では、どのマッピングがこのオプションをサポートしているかを示します。
表121-7 マッピングによるメソッド・アクセスのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したメソッドまたは直接フィールド・アクセスの構成方法 |
Javaを使用したメソッドまたは直接フィールド・アクセスの構成方法 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
プロジェクト・レベルでのメソッド・アクセスの構成の詳細は、117.4項「プロジェクト・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照してください。
プロパティの変更追跡を有効にし(たとえば、@ChangeTracking
でメソッドgetPhone
を修飾するなど)、フィールド(phone
)に直接アクセスする場合、TopLinkでは変更が検出されないことに注意してください。詳細は、2.4.1.4項「メソッドおよび直接フィールド・アクセスの使用」を参照してください。
マッピングのフィールド・アクセス・メソッドを指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の情報を参照し、このタブの「メソッド・アクセス」フィールドを指定します。
フィールド | 説明 |
---|---|
メソッド・アクセス | このマッピングがpublic属性に直接アクセスするかわりに特定のアクセッサ・メソッドを使用するかどうかを指定します。デフォルトでは、このオプションは選択されていません(つまり、マッピングは直接アクセスを使用します)。 |
getメソッド | 特定のget メソッドを選択します。 |
setメソッド | 特定のset メソッドを選択します。 |
新しいすべてのマッピングで使用されるデフォルトのアクセス・タイプを変更するには、プロジェクトのエディタ・ウィンドウで「デフォルト」タブを使用します。詳細は、117.4項「プロジェクト・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照してください。
次のDatabaseMapping
メソッドを使用して、TopLinkがマップ済属性へのアクセスに使用するユーザー定義のgetterおよびsetterを構成します。
Oracle JDeveloperおよびTopLink Workbenchでサポートされていないマッピングに関しては、属性に直接アクセスするかわりに、ユーザー定義のメソッドを介して属性にアクセスするため、次のようにsetGetMethodName
およびsetSetMethodName
メソッドを使用します。
setGetMethodName
: マップ済属性を取得するために、ユーザー定義メソッドのString
名を設定します。
setSetMethodName
: マップ済属性を設定するために、ユーザー定義メソッドのString
名を設定します。
例121-10は、オブジェクト・リレーショナル・データ・タイプ・マッピングで属性phones
およびアクセッサ・メソッドgetPhones
とsetPhones
を持つクラスでこれらのメソッドを使用する方法を示します。
TopLinkでは、オブジェクト・リレーションシップはプライベート型にも独立型にもできます。
プライベート・リレーションシップでは、ターゲット・オブジェクトは、ソース・オブジェクトのプライベート・コンポーネントです。ターゲット・オブジェクトは、ソースなしで存在できず、ソース・オブジェクトを介してのみアクセスできます。ソース・オブジェクトを破棄することは、ターゲット・オブジェクトを破棄することにもなります。
独立したリレーションシップでは、ソースおよびターゲットのオブジェクトは、独立して存在するパブリック・オブジェクトです。一方のオブジェクトを破棄したからといって他方のオブジェクトが破棄されることはありません。
ヒント: TopLinkは、プライベート・リレーションシップを自動的に管理します。オブジェクトがデータベースに書き込まれるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトもデータベースに書き込まれます。オブジェクトがデータベースから削除されるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトも削除されます。このことはアプリケーションの動作およびパフォーマンスの両方に影響を及ぼす可能性があるため、新しいシステムを作成するときは注意してください。 |
表121-8では、どのマッピングがこのオプションをサポートしているかを示します。
表121-8 マッピングによるプライベート・リレーションシップまたは独立したリレーションシップのサポート
私有マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
私有を作成するには、「私有」オプションを選択します。
Oracle JDeveloperおよびTopLink Workbenchでサポートされていないマッピングに対しては、independentRelationship
(デフォルト)、privateOwnedRelationship
およびsetIsPrivateOwned
メソッドを使用します。
例121-11は、私有属性phones
を持つクラスでこれらのメソッドをマッピングに使用する方法を示します。
マッピングごとに自由形式のテキスト・コメントを定義できます。これらのコメントは任意の用途に使用できます。たとえば、マッピングの目的または重要性など、プロジェクトの重要な実装詳細を記録することなどに使用できます。
コメントはTopLinkデプロイXMLファイルのOracle JDeveloperまたはTopLink Workbenchプロジェクトに格納されます。この機能に対応するJava APIはありません。
表121-9では、どのマッピングがこのオプションをサポートしているかを示します。
表121-9 マッピングによるコメントのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したマッピング・コメントの構成方法 |
Javaの使用方法 |
---|---|---|---|
|
|
||
|
|
||
|
|
マッピングにコメントを追加するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
このマッピングを説明するコメントを入力します。
シリアライズ・オブジェクト・コンバータを使用して、任意のオブジェクトまたはオブジェクトのセットをデータ・ソースのバイナリ・ラージ・オブジェクト(BLOB)フィールドに格納できます。コンバータはJavaシリアライザを使用するため、ターゲットはシリアライズ可能である必要があります。
シリアライズ・オブジェクト・コンバータの詳細は、17.2.6.1項「シリアライズ・オブジェクト・コンバータ」を参照してください。
表121-10では、どのマッピングがこのオプションをサポートしているかを示します。
表121-10 マッピングによるシリアライズ・オブジェクト・コンバータのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したシリアライズ・オブジェクト・コンバータの構成方法 |
Javaを使用したシリアライズ・オブジェクト・コンバータの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
オブジェクト・リレーショナル・データ・タイプの配列マッピング |
|
||
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
シリアライズ・オブジェクト・ダイレクト・マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
シリアライズ・オブジェクト・コンバータを指定するには、「シリアライズ・オブジェクト・コンバータ」オプションを選択します。
例121-12で示されているように、AbstractCompositeDirectCollectionMapping
メソッドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスまたはそのサブクラスにoracle.toplink.converters.SerializedObjectConverter
を設定できます。
例121-12 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);
また、AbstractDirectMapping
メソッドsetConverter
を使用して、oracle.toplink.mappings.foundation.AbstractDirectMapping
のインスタンスまたはそのサブクラスにSerializedObjectConverter
を設定できます。
タイプ変換コンバータは、データ・ソース・タイプをJavaタイプに明示的にマップするために使用します。
タイプ変換コンバータの詳細は、17.2.6.2項「タイプ変換コンバータ」を参照してください。
表121-11では、どのマッピングがこのオプションをサポートしているかを示します。
表121-11 マッピングによるタイプ変換コンバータのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したタイプ変換コンバータの構成方法 |
Javaを使用したタイプ変換コンバータの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|||
オブジェクト・リレーショナル・データ・タイプの配列マッピング |
|
||
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
タイプ変換ダイレクト・マッピングを作成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
「タイプ変換コンバータ」オプションを選択します。
次の情報を参照し、「コンバータ」タブで「タイプ変換コンバータ」のフィールドを指定します。
フィールド | 説明 |
---|---|
データ・タイプ | データ・ソースのデータのJavaタイプを選択します。 |
属性タイプ | Javaクラスの属性のJavaタイプを選択します。 |
例121-13で示されているように、AbstractCompositeDirectCollectionMapping
メソッドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスまたはそのサブクラスにoracle.toplink.converters.TypeConversionConverter
を設定できます。
例121-13 TypeConversionConverterの構成
// Create TypeConversionConverter instance TypeConversionConverter typeConversionConverter = new TypeConversionConverter(); typeConversionConverter.setDataClass(java.util.Calendar.class); typeConversionConverter.setObjectClass(java.sql.Date.class); // Set TypeConversionConverter on ArrayMapping ArrayMapping arrayMapping = new ArrayMapping(); arrayMapping.setValueConverter(typeConversionConverter); arrayMapping.setAttributeName("date"); arrayMapping.setStructureName("Date_t"); arrayMapping.setFieldName("DATE"); orDescriptor.addMapping(arrayMapping);
また、AbstractDirectMapping
メソッドsetConverter
を使用して、oracle.toplink.mappings.foundation.AbstractDirectMapping
のインスタンスまたはそのサブクラスにTypeConversionConverter
を設定できます。
TypeConversionConverter
インスタンスの構成には、次のAPIが使用されています。
setDataClass(java.lang.Class dataClass)
: データ・タイプ・クラスを指定します。
setObjectClass(java.lang.Class objectClass)
: オブジェクト・タイプ・クラスを指定します。
オブジェクト・タイプ・コンバータは、一定数のデータ・ソースのデータ値をJavaオブジェクト値に対応させるために使用します。このコンバータは、データ・ソースにある値とJavaにある値が異なる場合に使用できます。
オブジェクト・タイプ・コンバータの詳細は、17.2.6.3項「オブジェクト・タイプ・コンバータ」を参照してください。
表121-12では、どのマッピングがこのオプションをサポートしているかを示します。
表121-12 マッピングによるオブジェクト・タイプ・コンバータのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したオブジェクト・タイプ・コンバータの構成方法 |
Javaを使用したオブジェクト・タイプ・コンバータの構成方法 |
---|---|---|---|
|
|
|
|
|
|||
オブジェクト・リレーショナル・データ・タイプの配列マッピング |
|
||
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
オブジェクト・タイプ・コンバータをダイレクト・マッピングに追加するには、次の手順を実行します。
ナビゲータでマッピングを選択します。そのプロパティがエディタに表示されます。
「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。
マッピングの「コンバータ」タブにある次のフィールドを使用して、オブジェクト・タイプ・コンバータのオプションを選択します。
フィールド | 説明 |
---|---|
データ・タイプ | データ・ソースのデータのJavaタイプを選択します。 |
属性タイプ | Javaクラスの属性のJavaタイプを選択します。 |
変換値 | 新しい変換値を追加するには、「追加」をクリックします。既存の変換値を変更するには、「編集」をクリックします。既存の変換値を削除するには、「削除」をクリックします。
選択した値をデフォルト値として指定するために使用します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。 |
データ値 | データ・ソースの属性の値を指定します。 |
属性値 | Javaクラスの属性の値を指定します。 |
デフォルト属性値 | 選択した値をデフォルト値として使用するかどうかを指定します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。 |
AbstractCompositeDirectCollectionMapping
メソッドsetValueConverter
を使用して、oracle.toplink.mappings.foundation.AbstractCompositeDirectCollectionMapping
のインスタンスにoracle.toplink.converters.ObjectTypeConverter
を設定できます。
また、例121-14で示されているように、AbstractDirectMapping
メソッドsetConverter
を使用して、oracle.toplink.mappings.foundation.AbstractDirectMapping
のインスタンスまたはそのサブクラスにObjectTypeConverter
を設定できます。
例121-14 ObjectTypeConverterの構成
// Create ObjectTypeConverter instance ObjectTypeConverter objectTypeConvter = new ObjectTypeConverter(); objectTypeConverter.addConversionValue("F", "Female"); // Set ObjectTypeConverter on DirectToFieldMapping DirectToFieldMapping genderMapping = new DirectToFieldMapping(); genderMapping.setConverter(objectTypeConverter); genderMapping.setFieldName("F"); genderMapping.setAttributeName("Female"); descriptor.addMapping(genderMapping);
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が属性を指定している場合は使用できません。
詳細は、17.2.6.4項「シンプル・タイプ・トランスレータ」を参照してください。
表121-13では、どのマッピングがこのオプションをサポートしているかを示します。
表121-13 マッピングによるシンプル・タイプ・トランスレータのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したシンプル・タイプ・トランスレータの構成方法 |
Javaを使用したシンプル・タイプ・トランスレータの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
この表を使用して、XMLスキーマからの要素を修飾します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「XMLスキーマの"type"属性を使用」フィールドを選択して、XMLスキーマからの要素を修飾します。
IDEでJavaコードを使用するシンプル・タイプ・トランスレータでXMLマッピングを作成するには、次の要素が必要です。
EISDirectMapping
、EISCompositeDirectCollectionMapping
、XMLDirectMapping
またはXMLCompositeDirectCollectionMapping
Converter
のインスタンス
TypedElementField
のインスタンス
例121-15は、TopLinkがByte
配列(ClassConstants.ABYTE
)をBase64
(XMLConstants.BASE64_BINARY
)でエンコードされた文字列として書き込めるように、XML作成用の組込み変換をオーバーライドするため、XMLDirectMapping
で独自のシンプル・タイプ・トランスレータを実装する方法を示します。
例121-15 タイプ変換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スキーマに定義された適切な型保証列挙値に自動的に変換されます。
詳細は、17.2.10項「マッピングおよびJAXB型保証列挙」を参照してください。
表121-14では、どのマッピングがこのオプションをサポートしているかを示します。
表121-14 マッピングによるJAXB型保証列挙コンバータのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchの使用方法 | Javaを使用したJAXB型保証列挙コンバータの構成方法 |
---|---|---|---|
|
|
||
|
|
||
|
|||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
脚注1 XMLレコードの使用時のみ(76.4項「レコード形式の構成」を参照)。
JDeveloperおよびTopLink Workbenchでは、JAXBTypesafeEnumConverter
を使用するマッピングの構成で、このコンバータを直接サポートしていないため、Javaを使用して修正メソッドを作成する必要があります(121.13.1項「Javaを使用したJAXB型保証列挙コンバータの構成方法」を参照)。
プロジェクトおよびオブジェクト・モデルをTopLink JAXBコンパイラを使用して作成する場合(48.2項「XMLスキーマからのXMLプロジェクトの作成」を参照)、コンパイラでは型保証列挙クラスおよびディスクリプタ修正メソッドのあるクラスが作成され、必須修正メソッドが自動的に登録されます。
JavaでJAXBTypesafeEnumConverter
を使用してマッピングを構成するには、ディスクリプタ修正メソッドを使用します(119.35項「修正メソッドの構成」を参照)。例121-16は、JAXBTypesafeEnumConverter
でXMLDirectMapping
を構成する修正メソッドの例を示します。この例では、属性_Val
が、型保証クラスMyTypesafeEnum
に対応するJAXB型保証列挙にマップされます。
例121-16 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
またはVector
Set
: IndirectSet
またはHashSet
Collection
: IndirectList
またはVector
Map
: IndirectMap
またはHashMap
あるいは、使用する具象コンテナ・クラスをマッピングに指定することもできます。TopLinkがコレクション・マッピングでマップされた属性を含むオブジェクトをデータベースから読み取ると、その属性は指定された具象クラスのインスタンスで設定されます。たとえば、TopLinkでは、メモリー内でソートしません。メモリー内でソートするには、デフォルトのSet
タイプ(IndirectList
)を具象コレクション・タイプとしてjava.util.TreeSet
でオーバーライドします。デフォルトでは、コレクション・マッピングのコンテナ・クラスは、java.util.Vector
です。
注意: TopLink Workbenchを使用し、デフォルトのCollection クラスを独自のカスタムCollection クラスでオーバーライドする場合、独自のカスタムCollection クラスをTopLink Workbenchのクラスパスに入れる必要があります(5.2項「TopLink Workbench環境の構成」を参照)。 |
表121-15では、どのマッピングがこのオプションをサポートしているかを示します。
表121-15 マッピングによるコンテナ・ポリシーのサポート
マッピング | List | Set | Collection | Map | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したコンテナ・ポリシーの構成方法 |
Javaを使用したコンテナ・ポリシーの構成方法 |
---|---|---|---|---|---|---|---|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
オブジェクト・リレーショナル・データ・タイプの配列マッピング |
|
|
|
|
|
|
|
オブジェクト・リレーショナル・データ・タイプのオブジェクト配列マッピング |
|
|
|
|
|
|
|
オブジェクト・リレーショナル・データ・タイプのネストした表マッピング |
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
マッピングのコンテナ・ポリシーを指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「詳細」ボタンをクリックします。「拡張コンテナ・オプション」が「一般」タブに表示されます。
「一般」タブの「拡張コンテナ・オプション」のフィールドを使用し、コンテナ・オプションを指定します。
フィールド脚注1 | 説明 |
---|---|
コンテナ・タイプ | 使用するCollection クラスのタイプを指定します。
|
デフォルト・クラスのオーバーライド | カスタム・クラスをマッピングのコンテナ・ポリシーとして使用することを指定します。「参照」をクリックして、異なるクラスを選択します。コンテナ・クラスには、java.util.Collection インタフェースを実装(直接的または間接的に)する必要があります。 |
キー・メソッド | 「コンテナ・タイプ」を「Map」として構成する場合、このオプションを使用してゼロ引数メソッドの名前を指定します。ターゲット・オブジェクトに対してコールされたこのメソッドの結果は、Hashtable またはMap でキーとして使用されます。このメソッドは、Hashtable またはMap で有効なキーとなるオブジェクトを返す必要があります。 |
脚注1 一部のマッピングでは、サポートされていないオプションがあります。詳細は、表121-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
を指定します。
例121-17は、DirectCollectionMapping
を構成してjava.util.ArrayList
コンテナ・クラスを使用する方法を示します。
例121-17 ダイレクト・コレクション・マッピング
// Create a new mapping and register it with the source descriptor DirectCollectionMapping phonesMapping = new DirectCollectionMapping(); phonesMapping.setAttributeName("phones"); phonesMapping.setGetMethodName("getPhones"); phonesMapping.setSetMethodName("setPhones"); phonesMapping.setReferenceTableName("PHONES_TB"); phonesMapping.setDirectFieldName("PHONES"); phonesMapping.useCollectionClass(ArrayList.class); // set container policy descriptor.addMapping(phonesMapping);
トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマ(121.16項「フィールド・トランスフォーマ・アソシエーションの構成」を参照)です。
この項では、読取り(アンマーシャリング)時にフィールドから属性へのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用する属性トランスフォーマを構成する方法について説明します。
メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。
メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非介入的です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。
表121-16では、どのマッピングがこのオプションをサポートしているかを示します。
表121-16 マッピングによる属性トランスフォーマのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用した属性トランスフォーマの構成方法 |
Javaを使用した属性トランスフォーマの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|||
|
|
|
|
|
|||
|
|
|
|
マッピングの属性トランスフォーマを指定するには、次の手順を実行します。
ナビゲータでトランスフォーメーション・マッピングを選択します。そのプロパティがエディタに表示されます。
「編集」をクリックします。「トランスフォーマの指定」ダイアログ・ボックスが表示されます。
次の情報を参照し、ダイアログ・ボックスの各フィールドにデータを入力し、「OK」をクリックします。
フィールド | 説明 |
---|---|
トランスフォーメーション・メソッドの使用 | トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。 |
トランスフォーマ・クラスの使用 | トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、TopLink Workbenchアプリケーションのクラスパスに含まれている必要があります。 |
メソッド・ベース属性トランスフォーマは、AbstractTransformationMapping
メソッドsetAttributeTransformation
を使用し、使用するドメイン・オブジェクト・メソッドの名前を渡すことで構成できます。
クラス・ベース属性トランスフォーマは、AbstractTransformationMapping
メソッドsetAttributeTransformer
を使用し、oracle.toplink.mappings.Transfomers.AttributeTransformer
のインスタンスを渡すことで構成できます。
AttributeTransformer
を作成するには、AttributeTransformerAdapter
を拡張すると便利です。
トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ(121.15項「属性トランスフォーマの構成」を参照)、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマです。
この項では、書込み(マーシャリング)時にオブジェクト属性からフィールドへのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用するフィールド・トランスフォーマを構成する方法について説明します。
メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。
メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非介入的です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。
表121-17では、どのマッピングがこのオプションをサポートしているかを示します。
表121-17 マッピングによるフィールド・トランスフォーマのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用したフィールド・トランスフォーマ・アソシエーションの構成方法 |
Javaを使用したフィールド・トランスフォーマ・アソシエーションの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|||
|
|
|
|
|
|||
|
|
|
|
次の手順を使用して、「オブジェクト -> Fieldメソッド」のフィールドを指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
図121-17 「トランスフォーメーション・マッピング」、「フィールド・トランスフォーマ・アソシエーション」
新しい関連付けを追加するには、「追加」をクリックします。121.16.1.1項「フィールド・トランスフォーマ・アソシエーションの指定」に進みます。
既存の関連付けを変更するには、「編集」をクリックします。121.16.1.1項「フィールド・トランスフォーマ・アソシエーションの指定」に進みます。
既存の関連付けを削除するには、「削除」をクリックします。
トランスフォーメーション・マッピングのフィールドに実際に使用するトランスフォーメーション・メソッドまたはクラスを指定するには、次の手順を実行します。
「トランスフォーメーション・マッピング」、「フィールド・トランスフォーマ・アソシエーション」から、「追加」または「編集」をクリックします。「フィールド・トランスフォーマ・アソシエーションの指定」ダイアログ・ボックスが表示されます。
次の情報を参照し、ダイアログ・ボックスの各フィールドを指定します。
フィールド | 説明 |
---|---|
フィールド | このトランスフォーメーションの対象とするデータベース・フィールドを(ディスクリプタの関連表から)選択します。 |
トランスフォーマ | トランスフォーメーションを制御する方法として、次のいずれかを選択します。 |
トランスフォーメーション・メソッドの使用 | トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。 |
トランスフォーマ・クラスの使用 | トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、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は、作業ユニットで値をクローンし、比較する必要があります(119.29項「コピー・ポリシーの構成」を参照)。
デフォルトでは、TopLinkは、すべてのトランスフォーメーション・マッピングが可変であるものと想定しています。マッピングで単純な不変の値をマップする場合は、IsMutableオプションをfalse
に構成すると、作業ユニットのパフォーマンスを向上できます。
デフォルトでは、TopLinkは、シリアライズ・コンバータが使用されている場合を除き、すべてのダイレクト・マッピングも可変であるものと想定しています。これらのマッピングでは、IsMutableオプションも設定できます。Date
またはCalendar
フィールドを変更する場合は、この設定が必要です。
表121-18では、どのマッピングがこのオプションをサポートしているかを示します。
詳細は、2.8.11項「可変性」を参照してください。
表121-18 マッピングでの可変マッピングのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用した可変マッピングの構成方法 |
Javaを使用した可変マッピングの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
この表を使用して「オブジェクト -> Fieldメソッド」フィールドを指定します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
デフォルトでは、「可変」オプションが、すべてのトランスフォーメーション・マッピングで選択されます。マッピングで、基本的で単純な値をマップする場合は、このオプションの選択を解除します。
マッピングを可変にするかどうかを指定するには、トランスフォーメーション・マッピングの場合はAbstractTransformationMapping
メソッドsetIsMutable
を、ダイレクト・マッピングの場合はAbstractDirectMapping
メソッドisMutable
を使用します。
TopLinkでは双方向リレーションシップを自動的に管理できます(2.14.3.4項「双方向リレーションシップの維持」を参照)。リレーションシップの一方が設定または変更された場合、TopLinkにより、もう一方が自動設定されます。この機能を有効にするには、1対1マッピングにはValueHolderインダイレクション(17.2.4.1項「ValueHolderインダイレクション」を参照)を、1対多および多対多マッピングには透過コレクション(17.2.4.2項「透過インダイレクト・コンテナ・インダイレクション」を参照)を使用します。
注意: このTopLink機能の使用はお薦めしません。オブジェクト・モデルが永続コンテキストの外部で使用される場合、双方向リレーションシップを管理する必要があります。かわりに、アプリケーションはgetterメソッドおよびsetterメソッドに双方向リレーションシップを維持する必要があります。 |
表121-19では、どのマッピングがこのオプションをサポートしているかを示します。
表121-19 マッピングでの双方向リレーションシップのサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用した双方向リレーションシップの構成方法 |
Javaを使用した双方向リレーションシップの構成方法 |
---|---|---|---|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
マッピングに双方向リレーションシップを設定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
次の表に説明されているタブの各フィールドにデータを入力します。
フィールド | 説明 |
---|---|
双方向リレーションシップのメンテナンス | TopLinkでこのリレーショナル・マッピングに双方向のリンクを設定する場合に指定します。 |
リレーションシップ・パートナ | この双方向リレーションシップのためのリレーションシップ・パートナを(「参照ディスクリプタ」のマップ済属性のリストから)選択します。 |
リレーションシップの2つのクラスが1対1マッピングによって相互に参照する双方向リレーションシップがマッピングにある場合(2.14.3.4項「双方向リレーションシップの維持」を参照)は、次のような外部キー情報を設定します。
マッピングの一方は、setForeignKeyFieldName
メソッドをコールする必要があります。
他方のマッピングは、setTargetForeignKeyFieldName
メソッドをコールする必要があります。
また、addForeignKeyFieldName
メソッドおよびaddTargetForeignKeyFieldName
メソッドをコールして、複合外部キー情報を設定することもできます。TopLinkによりインダイレクション(遅延ロード)はデフォルトで有効であるため、属性はValueHolderInterface
である必要があります。
例121-18は、Policy
とCarrier
クラスの間の双方向リレーションシップの設定を示します。外部キーは、Carrier
のコンポジット主キーを参照するPolicy
の表に格納されています。
例121-18 相互参照する2つのクラス間の双方向マッピングの実装
public class Policy { ... // create the mapping that references the Carrier class OneToOneMapping carrierMapping = new OneToOneMapping(); carrierMapping.setAttributeName("carrier"); carrierMapping.setReferenceClass(Carrier.class); carrierMapping.addForeignKeyFieldName("INSURED_ID", "CARRIER_ID"); carrierMapping.addForeignKeyFieldName("INSURED_TYPE", "TYPE"); descriptor.addMapping(carrierMapping); ... } public class Carrier { ... // create the mapping that references the Policy class OneToOneMapping policyMapping = new OneToOneMapping(); policyMapping.setAttributeName("masterPolicy"); policyMapping.setReferenceClass(Policy.class); policyMapping.addTargetForeignKeyFieldName("INSURED_ID", "CARRIER_ID"); policyMapping.addTargetForeignKeyFieldName("INSURED_TYPE", "TYPE"); descriptor.addMapping(policyMapping); ... }
表121-20にまとめられているXMLベース・マッピングでは、リスト値をマップする場合、マッピングでリストをアンマーシャリング(書込み)する際、<item>aaa bbb ccc</item>
のように1つのノードにするか、または次のように複数のノードにするかを構成できます。
<item>aaa</item> <item>bbb</item> <item>ccc</item>
表121-20では、どのマッピングがこのオプションをサポートしているかを示します。
表121-20 マッピングでの単独ノード使用のサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchを使用した単独ノードの使用の構成方法 |
Javaを使用した単独ノードの使用の構成方法 |
---|---|---|---|
|
|
||
|
|
|
|
|
|||
|
|
||
|
|
|
|
|
|
||
|
|
|
|
脚注1 XMLレコードの使用時のみ(76.4項「レコード形式の構成」を参照)。
単独ノードを使用するようにマッピングを構成するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
リスト値を単独ノード(<item>aaa bbb ccc</item>
など)にアンマーシャリング(書込み)するようにマッピングを構成するには、「単独ノードを使用」をクリックします。
デフォルトでは、マッピングはリスト値を別々のノードにアンマーシャリングします。
リスト値を単独ノードに書き込むようにマッピングを構成するには、AbstractCompositeDirectCollectionMapping
メソッドsetUsesSingleNode
にtrue
の値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、false
の値を渡します。
XMLField
を取得するマッピングでは、リスト値を単独ノードに書き込むようにマッピングを構成するには、XMLField
メソッドsetUsesSingleNode
にtrue
の値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、false
の値を渡します。例121-19は、このメソッドをXMLDirectMapping
で使用する方法を示します。
表121-21にまとめられているXMLベース・マッピングでは、マッピングを作成する場合、マッピングのテキストを<![CDATA[...]]>
文にラップするかどうかを構成できます。
表121-21では、どのマッピングがこのオプションをサポートしているかを示します。
表121-21 マッピングでのCDATA使用のサポート
マッピング | Oracle JDeveloperの使用方法 | TopLink Workbenchの使用方法 | Javaを使用したCDATAの使用の構成方法 |
---|---|---|---|
|
|||
|
|
||
|
|
||
|
|
||
|
|
XMLDirectMapping
またはXMLCompositeDirectCollectionMapping
に対してisCDATA()
メソッドを使用して、マッピングのテキストを<![CDATA[...]]>
文にラップするかどうかを指定します。
例121-20は、このメソッドの使用結果を示します。