ヘッダーをスキップ
Oracle Fusion Middleware Oracle TopLink開発者ガイド
11gリリース1(11.1.1)
B56246-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

121 マッピングの構成

この章では、複数のマッピング・タイプに共通のTopLinkマッピングのオプションを構成する方法について説明します。

この章の内容は次のとおりです。

表121-1は、構成可能なTopLinkマッピング・タイプと、そのタイプで対応している構成可能オプションが記載されたタイプ別の章への相互参照を示します。

表121-1 TopLinkマッピングの構成

作成対象 参照先

リレーショナル・マッピング


第28章「リレーショナル・マッピングの構成」


オブジェクト・リレーショナル・データ・タイプ・マッピング


第41章「オブジェクト・リレーショナル・データ・タイプ・マッピングの構成」


EISマッピング


第78章「EISマッピングの構成」


XMLマッピング


第54章「XMLマッピングの構成」



表121-2は、複数のTopLinkマッピング・タイプによって共有される構成可能オプションを示します。

詳細は、次を参照してください。

121.1 共通マッピング・オプションの構成

表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の使用の構成」を参照)

サポートされていない
サポートされていない
サポートされている

121.2 読取り専用マッピングの構成

読取り専用マッピングは、挿入、更新および削除の操作に影響を受けることはありません。

読取り専用マッピングは、オブジェクトにある複数の属性をデータベースの同じフィールドにマップするときに使用しますが、フィールドに書き込めるマッピングは1つのみです。

読取り専用マッピングを双方向の多対多マッピングで使用して、どのマッピングが多対多結合表を更新できるかを指定できます。


注意:

主キー・マッピングを読取り専用にすることはできません。

書込みロックまたはクラス・インジケータ・フィールドに対して定義されているマッピングは、読取り専用にする必要があります。ただし、書込みロックがキャッシュに格納されないように構成されている場合、またはクラス・インジケータが主キーの一部である場合を除きます。

読取り専用マッピングは、ディスクリプタの特定のマッピングが読取り専用の場合にのみ使用します。ディスクリプタ全体が読取り専用の場合、ディスクリプタ・レベルの設定を使用します(119.3項「読取り専用ディスクリプタの構成」を参照)。


注意:

読取り専用マッピングはデータベースに書き込まれませんが、TopLinkキャッシュにマージされます。

表121-3では、どのマッピングがこのオプションをサポートしているかを示します。

121.2.1 TopLink Workbenchを使用した読取り専用マッピングの構成方法

マッピングを読取り専用として指定するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-1 「一般」タブ、「読取り専用」オプション

    図121-1の説明が続きます
    「図121-1 「一般」タブ、「読取り専用」オプション」の説明

「読取り専用」オプションを選択してマッピングを読取り専用に設定し、更新および削除操作時に影響を受けないようにします。

121.2.2 Javaを使用した読取り専用マッピングの構成方法

次のDatabaseMappingメソッドを使用して、マッピングの読取りアクセスを構成します。

  • readOnly: マッピング読取りアクセスを読取り専用に構成します。

  • readWrite: マッピング読取りアクセスを読取りおよび書込みに構成します(デフォルト)。

例121-1は、phonesという名前の読取り専用属性を持つクラスでこれらのメソッドを使用する方法を示します。

例121-1 Javaでの読取り専用マッピングの構成

// Map the phones attribute
phonesMapping.setAttributeName("phones");

// Specify read-only
phonesMapping.readOnly();

121.3 インダイレクション(遅延ロード)の構成

インダイレクションが有効になっていない場合は、TopLinkで永続オブジェクトを取得すると、それによって参照先の依存オブジェクトがすべて取得されます。インダイレクション(遅延ロード)をリレーションシップ・マッピングでマップされた属性に対して有効にすると、TopLinkでは、参照されたオブジェクトのプレースホルダとしてインダイレクション・オブジェクトが使用されます。つまり、TopLinkでは、当該の指定属性にアクセスするまで、依存オブジェクトの読取りは遅延されます。これにより、特にアプリケーションが取得したオブジェクトのコンテンツのみを必要とし、そのオブジェクトが参照するオブジェクトのコンテンツは必要としない場合に、パフォーマンスの大幅な向上が見られます。

すべてのリレーションシップ・マッピングに対してインダイレクションを使用することをお薦めします。これにより、データ・ソースへのアクセスを最適化できるのみでなく、作業ユニット処理、キャッシュ・アクセスおよび同時実行性のTopLinkによる最適化が可能になります。

表121-4では、どのマッピングがこのオプションをサポートしているかを示します。

一般に、1対1マッピングにはValueHolderインダイレクションを、コレクション・マッピングには透過インダイレクト・コンテナ・インダイレクションを使用することをお薦めします。トランスフォーメーションの実行がリソースに負荷のかかるタスク(リレーショナル・プロジェクトでのデータベースへのアクセスなど)の場合、トランスフォーメーション・マッピングに対してインダイレクションを有効にします。

EJBでインダイレクションを使用する場合、使用するEJBのバージョンおよびアプリケーション・サーバーが、インダイレクションの構成方法および適用するインダイレクションのタイプの決定に影響します。

アプリケーションのシリアライズ対象となるオブジェクトにインダイレクションを使用する場合、デシリアライズ時にトリガーされないインダイレクション・オブジェクトの影響を検討する必要があります。

ウィービング用に構成したJPAエンティティまたはPOJOクラスの場合、TopLinkでは、1対1マッピングのValueHolderインダイレクションのウィービングが実行されます。アプリケーションにコレクション・マッピング(1対多または多対多)が含まれている場合にTopLinkで変更追跡に対するウィービングが実行されるようにするには、すべてのコレクション・マッピングに対し、透過インダイレクト・コンテナ・インダイレクションのみが使用されるように構成する必要があります(コレクション・マッピングは、即時ロードやValueHolderインダイレクションが使用されるようには構成できません)。

詳細は、次を参照してください。

121.3.1 TopLink Workbenchを使用したインダイレクションの構成方法

インダイレクション・オプションは、マッピングの「一般」タブで、次の手順に従って指定します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-2 「一般」タブ、インダイレクション・オプション

    図121-2の説明が続きます
    「図121-2 「一般」タブ、インダイレクション・オプション」の説明

次の情報を参照し、タブのインダイレクションのフィールドを指定します。

フィールド 説明
インダイレクションの使用 このマッピングがインダイレクションを使用する場合に指定します。
    ValueHolder マッピングがValueHolderインダイレクションを使用する場合に指定します。詳細は、17.2.4.1項「ValueHolderインダイレクション」を参照してください。
    プロキシ マッピングがプロキシ・インダイレクションを使用する場合に指定します。詳細は、 17.2.4.3項「プロキシ・インダイレクション」を参照してください。

121.3.2 Javaを使用したインダイレクションの構成方法

Java APIを介してマッピングを作成すると、すべての外部参照マッピングでは、ValueHolderインダイレクションの使用がデフォルトとなり、すべてのトランスフォーメーション・マッピングでは、インダイレクションの非使用がデフォルトとなります。

インダイレクションを無効にするには、ForeignReferenceMappingメソッドdontUseIndirectionを使用します。

ValuHolderインダイレクションを有効にするには、ForeignReferenceMappingメソッドuseBasicIndirectionを使用します。

透過コンテナ・インダイレクションを有効にするには、次のいずれかのCollectionMappingメソッドを使用します。

  • useTransparentCollection

  • useTransparentList

  • useTransparentMap

  • useTransparentSet

プロキシ・インダイレクションを有効にするには、ObjectReferenceMappingメソッドuseProxyIndirectionを使用します。

さらに、この項では、次の内容について説明します。

121.3.2.1 ValueHolderインダイレクションの構成

oracle.toplink.mappings.ForeignReferenceMappingおよびoracle.toplink.mappings.foundation.AbstractTransformationMappingのインスタンスには、useBasicIndirectionメソッドがあり、oracle.toplink.indirection.ValueHolderInterfaceを使用してコーディングする属性への、それと実際のオブジェクトの間でのマッピングを構成できます。

属性がCollectionタイプ(Vectorなど)の場合は、IndirectContainer121.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であるものと予期します。

121.3.2.2 ValueHolderインダイレクションとメソッド・アクセスの同時構成

ValueHolderインダイレクションをメソッド・アクセス(121.6項「マッピング・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照)とともに使用している場合、Javaコード内の属性タイプをValueHolderInterfaceに変更することに加え、2対のgetterおよびsetterメソッドをTopLinkに提供することも必要です。

  • マッピングに登録されTopLinkでのみ使用されるIndirectionオブジェクトのgetterおよびsetter。すなわち、ValueHolderInterfaceに一致したインスタンスを戻すgetメソッドと、同じインタフェースに一致した1つの引数を受け入れるsetメソッドです。

  • アプリケーションにより使用される実際の属性値のgetterとsetter。

例121-4は、メソッド・アクセスとともにValueHolderインダイレクションを使用したEmployeeクラスの例を示します。このクラスの定義では、Employeeaddress属性が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を使用します。

121.3.2.3 ValueHolderインダイレクションとJPAの同時構成

JPAを使用しながらインダイレクションを使用している際に、アプリケーションでインダイレクション対応(遅延ロード)エンティティをシリアライズする場合(17.2.4.7項「インダイレクション、シリアライズおよびデタッチ」を参照)は、次のようにしてTopLinkエージェントを使用するようにクライアントを構成します。これにより、デシリアライズでトリガーされないインダイレクション・オブジェクトが保持されます。

  1. クライアントのクラスパスに、<TOPLINK_HOME>\jlibにある次のJARファイルを含めてください。

    • toplink.jar

    • <your-application-persistence>.jar

  2. クライアントの起動に使用する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)を参照)。これにより、より適切なエラー・メッセージが表示され、マージの問題が解決されます。


注意:

静的ウィービングを使用してもシリアライズには影響を与えません。静的ウィービングを有効にしていなくても機能するためです。

121.3.2.4 IndirectContainerインダイレクションの構成

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-7 IndirectContainerインダイレクションを使用するマッピング

OneToOneMapping mapping = new OneToOneMapping();
mapping.useBasicIndirection();
mapping.setReferenceClass(Employee.class);
mapping.setAttributeName("addresses");
mapping.setGetMethodName("getAddresses");
mapping.setSetMethodName("setAddresses");

121.3.2.5 プロキシ・インダイレクションの構成

例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リレーションシップ・マッピングの例を示します。

例121-9 プロキシ・インダイレクションを使用するマッピング

OneToOneMapping mapping = new OneToOneMapping();
mapping.useProxyIndirection();
mapping.setReferenceClass(Employee.class);
mapping.setAttributeName("address");
mapping.setGetMethodName("getAddress");
mapping.setSetMethodName("setAddress");

121.4 XPathの構成

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」を参照してください。

121.4.1 TopLink Workbenchを使用したXPathの構成方法

前述の表を使用して、XMLレコードを使用したXMLマッピングまたはEISマッピングのためのXPathを選択します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 必要に応じて、「一般」タブをクリックします。「一般」タブが表示されます。

    図121-3 「一般」タブ、「XPath」のオプション

    図121-3の説明が続きます
    「図121-3 「一般」タブ、「XPath」のオプション」の説明

    図121-4 コンポジット・オブジェクト・マッピングのXPathオプション

    図121-4の説明が続きます
    「図121-4 コンポジット・オブジェクト・マッピングのXPathオプション」の説明

「参照」をクリックして、この属性にマップするXPathを選択します(121.4.1.1項「XPathの選択」を参照)。

XMLレコードを使用したEISコンポジット・オブジェクト・マッピングまたはXMLコンポジット・オブジェクト・マッピングでは、次のいずれかを選択できます。

121.4.1.1 XPathの選択

「XPathの選択」ダイアログ・ボックスから、XPathを選択して「OK」をクリックします。TopLink Workbenchにより、完全なXPath名が作成されます。

図121-5 「XPathの選択」ダイアログ・ボックス

図121-5の説明が続きます
「図121-5 「XPathの選択」ダイアログ・ボックス」の説明

121.5 マッピング・レベルでのデフォルトのNULL値の構成

デフォルトのNULL値は、TopLinkが、NULL値をデータ・ソースから読み取ったときにNULLのかわりに使用する、JavaのObjectタイプおよび値です。

デフォルトのNULL値をマッピング・レベルで構成すると、TopLinkはこの値を使用して次の双方向で変換を行います。

表121-6では、どのマッピングがこのオプションをサポートしているかを示します。


注意:

デフォルトのNULL値は、Objectである必要があります。プリミティブ値(intなど)を指定するには、対応するObjectラッパー(Integerなど)を使用する必要があります。

TopLinkを使用して、セッションで使用されるすべてのマッピングにデフォルトのNULL値を設定することもできます(97.6項「ログイン・レベルでのデフォルトのNULL値の構成」を参照)。

121.5.1 TopLink Workbenchを使用したマッピング・レベルでのデフォルトのNULL値の構成方法

マッピングにデフォルトのNULL値を構成するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-6 「一般」タブ、「デフォルトのNULL値」のオプション

    図121-6の説明が続きます
    「図121-6 「一般」タブ、「デフォルトのNULL値」のオプション」の説明

次の情報を参照し、このタブで「デフォルトのNULL値」フィールドを指定します。

フィールド 説明
デフォルトのNULL値 データ・ソースがNULLの場合に、このマッピングにデフォルト値を含めるかどうかを指定します。選択した場合、デフォルトの「タイプ」「値」を入力する必要があります。
    タイプ デフォルト値のJavaタイプを選択します。
     デフォルト値を入力します。

121.5.2 Javaを使用したマッピング・レベルでのデフォルトのNULL値の構成方法

Java APIを使用してマッピングNULL値を構成するには、AbstractDirectMappingメソッドsetNullValueを使用します。

次に例を示します。

// Defaults a null salary to 0
salaryMapping.setNullValue(new Integer(0));

121.6 マッピング・レベルでのメソッドまたは直接フィールド・アクセスの構成

デフォルトでは、TopLinkは直接アクセスを使用してpublic属性にアクセスします。あるいは、オブジェクトの属性をデータベースに書き込むとき、またはデータベースからオブジェクトの属性を読み取るときに、getterおよびsetterメソッドを使用してオブジェクトの属性にアクセスすることもできます。これは、メソッド・アクセスと呼ばれます。

private、protectedまたはパッケージの各変数あるいはメソッド・アクセスを使用するには、Javaリフレクションのセキュリティ設定を有効にする必要があります。ほとんどのアプリケーション・サーバーでは、これはデフォルトで有効になっていますが(8.2.3項「セキュリティ・パーミッションの設定方法」を参照)、一定のJVM構成では明示的に有効にする必要があります。必要な場合、java.policyファイルを使用して、ReflectPermissionをアプリケーション全体またはアプリケーションのコードベースに付与します。次に例を示します。

grant{
     permission java.lang.reflect.ReflectPermission;
};

オブジェクトの作成時に、パフォーマンスを向上させ、アプリケーション固有の動作を実行できないようにするには、直接アクセスを可能なかぎり使用することをお薦めします。

表121-7では、どのマッピングがこのオプションをサポートしているかを示します。

プロジェクト・レベルでのメソッド・アクセスの構成の詳細は、117.4項「プロジェクト・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照してください。

プロパティの変更追跡を有効にし(たとえば、@ChangeTrackingでメソッドgetPhoneを修飾するなど)、フィールド(phone)に直接アクセスする場合、TopLinkでは変更が検出されないことに注意してください。詳細は、2.4.1.4項「メソッドおよび直接フィールド・アクセスの使用」を参照してください。

121.6.1 TopLink Workbenchを使用したメソッドまたは直接フィールド・アクセスの構成方法

マッピングのフィールド・アクセス・メソッドを指定するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-7 「一般」タブ、「メソッド・アクセス」のオプション

    図121-7の説明が続きます
    「図121-7 「一般」タブ、「メソッド・アクセス」のオプション」の説明

次の情報を参照し、このタブの「メソッド・アクセス」フィールドを指定します。

フィールド 説明
メソッド・アクセス このマッピングがpublic属性に直接アクセスするかわりに特定のアクセッサ・メソッドを使用するかどうかを指定します。デフォルトでは、このオプションは選択されていません(つまり、マッピングは直接アクセスを使用します)。
    getメソッド 特定のgetメソッドを選択します。
    setメソッド 特定のsetメソッドを選択します。

新しいすべてのマッピングで使用されるデフォルトのアクセス・タイプを変更するには、プロジェクトのエディタ・ウィンドウで「デフォルト」タブを使用します。詳細は、117.4項「プロジェクト・レベルでのメソッドまたは直接フィールド・アクセスの構成」を参照してください。

121.6.2 Javaを使用したメソッドまたは直接フィールド・アクセスの構成方法

次のDatabaseMappingメソッドを使用して、TopLinkがマップ済属性へのアクセスに使用するユーザー定義のgetterおよびsetterを構成します。

Oracle JDeveloperおよびTopLink Workbenchでサポートされていないマッピングに関しては、属性に直接アクセスするかわりに、ユーザー定義のメソッドを介して属性にアクセスするため、次のようにsetGetMethodNameおよびsetSetMethodNameメソッドを使用します。

  • setGetMethodName: マップ済属性を取得するために、ユーザー定義メソッドのString名を設定します。

  • setSetMethodName: マップ済属性を設定するために、ユーザー定義メソッドのString名を設定します。

例121-10は、オブジェクト・リレーショナル・データ・タイプ・マッピングで属性phonesおよびアクセッサ・メソッドgetPhonessetPhonesを持つクラスでこれらのメソッドを使用する方法を示します。

例121-10 Javaでのアクセス・メソッドの構成

// Map the phones attribute
phonesMapping.setAttributeName("phones");

// Specify access method
phonesMapping.setGetMethodName("getPhones");
phonesMapping.setSetMethodName("setPhones");

121.7 プライベート・リレーションシップまたは独立したリレーションシップの構成

TopLinkでは、オブジェクト・リレーションシップはプライベート型にも独立型にもできます。


ヒント:

TopLinkは、プライベート・リレーションシップを自動的に管理します。オブジェクトがデータベースに書き込まれるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトもデータベースに書き込まれます。オブジェクトがデータベースから削除されるときには、常に、そのオブジェクトが所有するすべてのプライベート・オブジェクトも削除されます。このことはアプリケーションの動作およびパフォーマンスの両方に影響を及ぼす可能性があるため、新しいシステムを作成するときは注意してください。

表121-8では、どのマッピングがこのオプションをサポートしているかを示します。

表121-8 マッピングによるプライベート・リレーションシップまたは独立したリレーションシップのサポート

マッピング 暗黙的Private Privateまたは独立 Oracle JDeveloperの使用方法 TopLink Workbenchを使用したプライベート・リレーションシップまたは独立したリレーションシップの構成方法
Javaを使用したプライベート・リレーションシップまたは独立したリレーションシップの構成方法

リレーショナル・マッピング







    1対1マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


    可変1対1マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


    1対多マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


    多対多マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


    集約コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    ダイレクト・コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    ダイレクト・マップ・マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


    集約オブジェクト・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


オブジェクト・リレーショナル・データ・タイプ・マッピング







    オブジェクト・リレーショナル・データ・タイプの構造マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    オブジェクト・リレーショナル・データ・タイプの参照マッピング


サポートされていない


サポートされている


サポートされていない


サポートされていない


サポートされている


    オブジェクト・リレーショナル・データ・タイプの配列マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    オブジェクト・リレーショナル・データ・タイプのオブジェクト配列マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    オブジェクト・リレーショナル・データ・タイプのネストした表マッピング


サポートされていない


サポートされている


サポートされていない


サポートされていない


サポートされている


EISマッピング







    EISコンポジット・ダイレクト・コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    EISコンポジット・オブジェクト・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    EISコンポジット・コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    EISの1対1マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


    EISの1対多マッピング


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


XMLマッピング







    XMLコンポジット・ダイレクト・コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    XMLコンポジット・オブジェクト・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない


    XMLコンポジット・コレクション・マッピング


サポートされている


サポートされていない


サポートされていない


サポートされていない


サポートされていない



121.7.1 TopLink Workbenchを使用したプライベート・リレーションシップまたは独立したリレーションシップの構成方法

私有マッピングを作成するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-8 「一般」タブ、「私有」オプション

    図121-8の説明が続きます
    「図121-8 「一般」タブ、「私有」オプション」の説明

私有を作成するには、「私有」オプションを選択します。

121.7.2 Javaを使用したプライベート・リレーションシップまたは独立したリレーションシップの構成方法

Oracle JDeveloperおよびTopLink Workbenchでサポートされていないマッピングに対しては、independentRelationship(デフォルト)、privateOwnedRelationshipおよびsetIsPrivateOwnedメソッドを使用します。

例121-11は、私有属性phonesを持つクラスでこれらのメソッドをマッピングに使用する方法を示します。

例121-11 Javaでのアクセス・メソッドの構成

// Map the phones attribute
phonesMapping.setAttributeName("phones");

// Specify as privately owned
phonesMapping.privateOwnedRelationship();

121.8 マッピング・コメントの構成

マッピングごとに自由形式のテキスト・コメントを定義できます。これらのコメントは任意の用途に使用できます。たとえば、マッピングの目的または重要性など、プロジェクトの重要な実装詳細を記録することなどに使用できます。

コメントはTopLinkデプロイXMLファイルのOracle JDeveloperまたはTopLink Workbenchプロジェクトに格納されます。この機能に対応するJava APIはありません。

表121-9では、どのマッピングがこのオプションをサポートしているかを示します。

表121-9 マッピングによるコメントのサポート

マッピング Oracle JDeveloperの使用方法 TopLink Workbenchを使用したマッピング・コメントの構成方法
Javaの使用方法

リレーショナル・マッピング


サポートされていない

サポートされている


サポートされていない

EISマッピング


サポートされていない

サポートされている


サポートされていない

XMLマッピング


サポートされていない

サポートされている


サポートされていない

121.8.1 TopLink Workbenchを使用したマッピング・コメントの構成方法

マッピングにコメントを追加するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-9 「一般」タブ、「コメント」

    図121-9の説明が続きます
    「図121-9 「一般」タブ、「コメント」」の説明

このマッピングを説明するコメントを入力します。

121.9 シリアライズ・オブジェクト・コンバータの構成

シリアライズ・オブジェクト・コンバータを使用して、任意のオブジェクトまたはオブジェクトのセットをデータ・ソースのバイナリ・ラージ・オブジェクト(BLOB)フィールドに格納できます。コンバータはJavaシリアライザを使用するため、ターゲットはシリアライズ可能である必要があります。

シリアライズ・オブジェクト・コンバータの詳細は、17.2.6.1項「シリアライズ・オブジェクト・コンバータ」を参照してください。

表121-10では、どのマッピングがこのオプションをサポートしているかを示します。

121.9.1 TopLink Workbenchを使用したシリアライズ・オブジェクト・コンバータの構成方法

シリアライズ・オブジェクト・ダイレクト・マッピングを作成するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。

    図121-10 「コンバータ」タブ、「シリアライズ・オブジェクト・コンバータ」オプション

    図121-10の説明が続きます
    「図121-10 「コンバータ」タブ、「シリアライズ・オブジェクト・コンバータ」オプション」の説明

シリアライズ・オブジェクト・コンバータを指定するには、「シリアライズ・オブジェクト・コンバータ」オプションを選択します。

121.9.2 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を設定できます。

121.10 タイプ変換コンバータの構成

タイプ変換コンバータは、データ・ソース・タイプをJavaタイプに明示的にマップするために使用します。

タイプ変換コンバータの詳細は、17.2.6.2項「タイプ変換コンバータ」を参照してください。

表121-11では、どのマッピングがこのオプションをサポートしているかを示します。

121.10.1 TopLink Workbenchを使用したタイプ変換コンバータの構成方法

タイプ変換ダイレクト・マッピングを作成するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。

  3. 「タイプ変換コンバータ」オプションを選択します。

    図121-11 「コンバータ」タブ、「タイプ変換コンバータ」オプション

    図121-11の説明が続きます
    「図121-11 「コンバータ」タブ、「タイプ変換コンバータ」オプション」の説明

次の情報を参照し、「コンバータ」タブで「タイプ変換コンバータ」のフィールドを指定します。

フィールド 説明
データ・タイプ データ・ソースのデータのJavaタイプを選択します。
属性タイプ Javaクラスの属性のJavaタイプを選択します。

121.10.2 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): オブジェクト・タイプ・クラスを指定します。

121.11 オブジェクト・タイプ・コンバータの構成

オブジェクト・タイプ・コンバータは、一定数のデータ・ソースのデータ値をJavaオブジェクト値に対応させるために使用します。このコンバータは、データ・ソースにある値とJavaにある値が異なる場合に使用できます。

オブジェクト・タイプ・コンバータの詳細は、17.2.6.3項「オブジェクト・タイプ・コンバータ」を参照してください。

表121-12では、どのマッピングがこのオプションをサポートしているかを示します。

121.11.1 TopLink Workbenchを使用したオブジェクト・タイプ・コンバータの構成方法

オブジェクト・タイプ・コンバータをダイレクト・マッピングに追加するには、次の手順を実行します。

  1. ナビゲータでマッピングを選択します。そのプロパティがエディタに表示されます。

  2. 「コンバータ」タブをクリックします。「コンバータ」タブが表示されます。

    図121-12 「コンバータ」タブ、「オブジェクト・タイプ・コンバータ」

    図121-12の説明が続きます
    「図121-12 「コンバータ」タブ、「オブジェクト・タイプ・コンバータ」」の説明

マッピングの「コンバータ」タブにある次のフィールドを使用して、オブジェクト・タイプ・コンバータのオプションを選択します。

フィールド 説明
データ・タイプ データ・ソースのデータのJavaタイプを選択します。
属性タイプ Javaクラスの属性のJavaタイプを選択します。
変換値 新しい変換値を追加するには、「追加」をクリックします。既存の変換値を変更するには、「編集」をクリックします。既存の変換値を削除するには、「削除」をクリックします。

選択した値をデフォルト値として指定するために使用します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。

    データ値 データ・ソースの属性の値を指定します。
    属性値 Javaクラスの属性の値を指定します。
    デフォルト属性値 選択した値をデフォルト値として使用するかどうかを指定します。TopLinkが有効な変換値としてマップされていない値をデータベースから取得すると、デフォルト値が使用されます。

121.11.2 Javaを使用したオブジェクト・タイプ・コンバータの構成方法

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): デフォルト値を設定します。

121.12 シンプル・タイプ・トランスレータの構成

シンプル・タイプ・トランスレータを使用すると、XML要素の値が、XMLスキーマで定義されているように、要素の<type>属性に基づいて適切なJavaタイプに自動的に変換されます。シンプル・タイプ・トランスレータは、マッピングのXPathが要素を指定している場合にのみ使用できます。シンプル・タイプ・トランスレータは、マッピングのXPathが属性を指定している場合は使用できません。

詳細は、17.2.6.4項「シンプル・タイプ・トランスレータ」を参照してください。

表121-13では、どのマッピングがこのオプションをサポートしているかを示します。

121.12.1 TopLink Workbenchを使用したシンプル・タイプ・トランスレータの構成方法

この表を使用して、XMLスキーマからの要素を修飾します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-13 「一般」タブ、「XMLスキーマの"type"属性を使用」オプション

    図121-13の説明が続きます
    「図121-13 「一般」タブ、「XMLスキーマの"type"属性を使用」オプション」の説明

「XMLスキーマの"type"属性を使用」フィールドを選択して、XMLスキーマからの要素を修飾します。

121.12.2 Javaを使用したシンプル・タイプ・トランスレータの構成方法

IDEでJavaコードを使用するシンプル・タイプ・トランスレータでXMLマッピングを作成するには、次の要素が必要です。

  • EISDirectMappingEISCompositeDirectCollectionMappingXMLDirectMappingまたはXMLCompositeDirectCollectionMapping

  • Converterのインスタンス

  • TypedElementFieldのインスタンス

例121-15は、TopLinkがByte配列(ClassConstants.ABYTE)をBase64XMLConstants.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);

121.13 JAXB型保証列挙コンバータの構成

JAXB型保証列挙コンバータを使用すると、XML要素の値が、XMLスキーマに定義された適切な型保証列挙値に自動的に変換されます。

詳細は、17.2.10項「マッピングおよびJAXB型保証列挙」を参照してください。

表121-14では、どのマッピングがこのオプションをサポートしているかを示します。

脚注1 XMLレコードの使用時のみ(76.4項「レコード形式の構成」を参照)。

JDeveloperおよびTopLink Workbenchでは、JAXBTypesafeEnumConverterを使用するマッピングの構成で、このコンバータを直接サポートしていないため、Javaを使用して修正メソッドを作成する必要があります(121.13.1項「Javaを使用したJAXB型保証列挙コンバータの構成方法」を参照)。

プロジェクトおよびオブジェクト・モデルをTopLink JAXBコンパイラを使用して作成する場合(48.2項「XMLスキーマからのXMLプロジェクトの作成」を参照)、コンパイラでは型保証列挙クラスおよびディスクリプタ修正メソッドのあるクラスが作成され、必須修正メソッドが自動的に登録されます。

121.13.1 Javaを使用したJAXB型保証列挙コンバータの構成方法

JavaでJAXBTypesafeEnumConverterを使用してマッピングを構成するには、ディスクリプタ修正メソッドを使用します(119.35項「修正メソッドの構成」を参照)。例121-16は、JAXBTypesafeEnumConverterXMLDirectMappingを構成する修正メソッドの例を示します。この例では、属性_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);
    }
}

121.14 コンテナ・ポリシーの構成

コレクション・マッピング・コンテナ・ポリシーでは、TopLinkがデータベースからターゲット・オブジェクトを読み取る際に必ず使用する必要がある具象クラスを指定します。

コレクション・マッピングでは、java.util.Listjava.util.Setjava.util.Collectionまたはjava.util.Mapインタフェースを実装する任意の具象クラスを使用できます。ListSetCollectionMapまたは、これらのインタフェースのサブインタフェースとして、あるいはこれらのインタフェースのうち1つを実装するクラスとして宣言されたオブジェクト属性をマップできます。

デフォルトでは、TopLinkランタイムは、これらのコンテナ・タイプごとに、oracle.toplink.indirectionパッケージに含まれる次の具象クラスを使用します。

あるいは、使用する具象コンテナ・クラスをマッピングに指定することもできます。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対多マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


    多対多マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


    集約コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされていない


サポートされている


    ダイレクト・コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている


    ダイレクト・マップ・マッピング


サポートされていない


サポートされていない


サポートされていない


サポートされている


サポートされている


サポートされている


サポートされている


オブジェクト・リレーショナル・データ・タイプ・マッピング









    オブジェクト・リレーショナル・データ・タイプの配列マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされていない


サポートされている


    オブジェクト・リレーショナル・データ・タイプのオブジェクト配列マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされていない


サポートされている


    オブジェクト・リレーショナル・データ・タイプのネストした表マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされていない


サポートされている


EISマッピング









    EISコンポジット・ダイレクト・コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている


    EISコンポジット・コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


    EISの1対多マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


XMLマッピング









    XMLコンポジット・ダイレクト・コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている


    XMLコンポジット・コレクション・マッピング


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


サポートされている


    XML任意コレクション・マッピング

サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている


    XMLバイナリ・データ・コレクション・マッピング

サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている


    XMLコレクション参照マッピング

サポートされている


サポートされている


サポートされている


サポートされていない


サポートされている


サポートされている


サポートされている



121.14.1 TopLink Workbenchを使用したコンテナ・ポリシーの構成方法

マッピングのコンテナ・ポリシーを指定するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

  3. 「詳細」ボタンをクリックします。「拡張コンテナ・オプション」が「一般」タブに表示されます。

    図121-14 「一般」タブ、「拡張コンテナ・オプション」

    図121-14の説明が続きます
    「図121-14 「一般」タブ、「拡張コンテナ・オプション」」の説明

「一般」タブの「拡張コンテナ・オプション」のフィールドを使用し、コンテナ・オプションを指定します。

フィールド脚注1 説明
コンテナ・タイプ 使用するCollectionクラスのタイプを指定します。
  • List: java.util.Listを使用します。

  • Set: java.util.Setを使用します。

  • Collection: java.util.Collectionを使用します。

  • Map: java.util.Mapを使用します。

デフォルト・クラスのオーバーライド カスタム・クラスをマッピングのコンテナ・ポリシーとして使用することを指定します。「参照」をクリックして、異なるクラスを選択します。コンテナ・クラスには、java.util.Collectionインタフェースを実装(直接的または間接的に)する必要があります。
キー・メソッド 「コンテナ・タイプ」「Map」として構成する場合、このオプションを使用してゼロ引数メソッドの名前を指定します。ターゲット・オブジェクトに対してコールされたこのメソッドの結果は、HashtableまたはMapでキーとして使用されます。このメソッドは、HashtableまたはMapで有効なキーとなるオブジェクトを返す必要があります。

脚注1 一部のマッピングでは、サポートされていないオプションがあります。詳細は、表121-15を参照してください。

121.14.2 Javaを使用したコンテナ・ポリシーの構成方法

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.CollectionMappingContainerMappingインタフェースを実装)を拡張したクラスにも、コンテナ・ポリシーを設定する次のメソッドがあります。

  • 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);

121.15 属性トランスフォーマの構成

トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマ(121.16項「フィールド・トランスフォーマ・アソシエーションの構成」を参照)です。

この項では、読取り(アンマーシャリング)時にフィールドから属性へのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用する属性トランスフォーマを構成する方法について説明します。

メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。

メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。

クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非介入的です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。

表121-16では、どのマッピングがこのオプションをサポートしているかを示します。

121.15.1 TopLink Workbenchを使用した属性トランスフォーマの構成方法

マッピングの属性トランスフォーマを指定するには、次の手順を実行します。

  1. ナビゲータでトランスフォーメーション・マッピングを選択します。そのプロパティがエディタに表示されます。

    図121-15 「トランスフォーメーション・マッピング」、「属性トランスフォーマ」フィールド

    図121-15の説明が続きます
    「図121-15 「トランスフォーメーション・マッピング」、「属性トランスフォーマ」フィールド」の説明

  2. 「編集」をクリックします。「トランスフォーマの指定」ダイアログ・ボックスが表示されます。

    図121-16 「トランスフォーマの指定」ダイアログ・ボックス

    図121-16の説明が続きます
    「図121-16 「トランスフォーマの指定」ダイアログ・ボックス」の説明

次の情報を参照し、ダイアログ・ボックスの各フィールドにデータを入力し、「OK」をクリックします。

フィールド 説明
トランスフォーメーション・メソッドの使用 トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
トランスフォーマ・クラスの使用 トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、TopLink Workbenchアプリケーションのクラスパスに含まれている必要があります。

121.15.2 Javaを使用した属性トランスフォーマの構成方法

メソッド・ベース属性トランスフォーマは、AbstractTransformationMappingメソッドsetAttributeTransformationを使用し、使用するドメイン・オブジェクト・メソッドの名前を渡すことで構成できます。

クラス・ベース属性トランスフォーマは、AbstractTransformationMappingメソッドsetAttributeTransformerを使用し、oracle.toplink.mappings.Transfomers.AttributeTransformerのインスタンスを渡すことで構成できます。

AttributeTransformerを作成するには、AttributeTransformerAdapterを拡張すると便利です。

121.16 フィールド・トランスフォーマ・アソシエーションの構成

トランスフォーメーション・マッピングを構成するのは、読取り(アンマーシャリング)時のフィールドから属性へのトランスフォーメーション用属性トランスフォーマ(121.15項「属性トランスフォーマの構成」を参照)、および書込み(マーシャリング)時の属性からフィールドへの、1つ以上のトランスフォーメーション用フィールド・トランスフォーマです。

この項では、書込み(マーシャリング)時にオブジェクト属性からフィールドへのトランスフォーメーションを実行するために、トランスフォーメーション・マッピングが使用するフィールド・トランスフォーマを構成する方法について説明します。

メソッド・ベース・トランスフォーマまたはクラス・ベース・トランスフォーマのいずれを使用しても構成できます。

メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。

クラス・ベース・トランスフォーマを使用すると、トランスフォーメーション・コードを別のクラスに入れることが可能です。すなわち、このアプローチは非介入的です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。

表121-17では、どのマッピングがこのオプションをサポートしているかを示します。

121.16.1 TopLink Workbenchを使用したフィールド・トランスフォーマ・アソシエーションの構成方法

次の手順を使用して、「オブジェクト -> Fieldメソッド」のフィールドを指定します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

    図121-17 「トランスフォーメーション・マッピング」、「フィールド・トランスフォーマ・アソシエーション」

    図121-17の説明が続きます
    「図121-17 「トランスフォーメーション・マッピング」、「フィールド・トランスフォーマ・アソシエーション」」の説明

新しい関連付けを追加するには、「追加」をクリックします。121.16.1.1項「フィールド・トランスフォーマ・アソシエーションの指定」に進みます。

既存の関連付けを変更するには、「編集」をクリックします。121.16.1.1項「フィールド・トランスフォーマ・アソシエーションの指定」に進みます。

既存の関連付けを削除するには、「削除」をクリックします。

121.16.1.1 フィールド・トランスフォーマ・アソシエーションの指定

トランスフォーメーション・マッピングのフィールドに実際に使用するトランスフォーメーション・メソッドまたはクラスを指定するには、次の手順を実行します。

  1. 「トランスフォーメーション・マッピング」、「フィールド・トランスフォーマ・アソシエーション」から、「追加」または「編集」をクリックします。「フィールド・トランスフォーマ・アソシエーションの指定」ダイアログ・ボックスが表示されます。

    図121-18 「フィールド・トランスフォーマ・アソシエーションの指定」ダイアログ・ボックス

    図121-18の説明が続きます
    「図121-18 「フィールド・トランスフォーマ・アソシエーションの指定」ダイアログ・ボックス」の説明

次の情報を参照し、ダイアログ・ボックスの各フィールドを指定します。

フィールド 説明
フィールド このトランスフォーメーションの対象とするデータベース・フィールドを(ディスクリプタの関連表から)選択します。
トランスフォーマ トランスフォーメーションを制御する方法として、次のいずれかを選択します。
    トランスフォーメーション・メソッドの使用 トランスフォーメーションを制御する特定のメソッドを選択します。メソッド・ベース・トランスフォーマは、ドメイン・オブジェクトにあるメソッドにマップする必要があります。
    トランスフォーマ・クラスの使用 トランスフォーメーションを制御する特定のクラスを選択します。このクラスは、TopLink Workbenchアプリケーションのクラスパスに含まれている必要があります。

121.16.2 Javaを使用したフィールド・トランスフォーマ・アソシエーションの構成方法

特定のトランスフォーメーション・メソッドを、ドメイン・オブジェクトまたはoracle.toplink.mappings.Transfomers.FieldTransformerのインスタンスに指定できます(FieldTransformerAdapterを拡張することもできます)。FieldTransformerの使用は、非介入的です。つまり、ドメイン・オブジェクトでは、TopLinkインタフェースを実装したり、特別なトランスフォーメーション・メソッドを用意する必要はありません。

メソッド・ベース・フィールド・トランスフォーマは、AbstractTransformationMappingメソッドaddFieldTransformationを使用し、使用するデータベース・フィールド名とドメイン・オブジェクト・メソッドの名前を渡すことで構成できます。

クラス・ベース・フィールド・トランスフォーマは、AbstractTransformationMappingメソッドaddFieldTransformerを使用し、データベース・フィールド名およびoracle.toplink.mappings.Transfomers.FieldTransformerのインスタンスを渡すことで構成できます。

FieldTransformerを作成するには、FieldTransformerAdapterを拡張すると便利です。

121.17 可変マッピングの構成

ダイレクト・マッピングは、通常、StringまたはIntegerなど、可変でない単純な値をマップします。トランスフォーメーション・マッピングは、複数のデータベース・フィールド値をJavaクラスのインスタンスにマッピングするなど、複雑な可変オブジェクト値をマップすることもできます。

トランスフォーメーション・マッピングが可変値をマップする場合、TopLinkは、作業ユニットで値をクローンし、比較する必要があります(119.29項「コピー・ポリシーの構成」を参照)。

デフォルトでは、TopLinkは、すべてのトランスフォーメーション・マッピングが可変であるものと想定しています。マッピングで単純な不変の値をマップする場合は、IsMutableオプションをfalseに構成すると、作業ユニットのパフォーマンスを向上できます。

デフォルトでは、TopLinkは、シリアライズ・コンバータが使用されている場合を除き、すべてのダイレクト・マッピングも可変であるものと想定しています。これらのマッピングでは、IsMutableオプションも設定できます。DateまたはCalendarフィールドを変更する場合は、この設定が必要です。

表121-18では、どのマッピングがこのオプションをサポートしているかを示します。

詳細は、2.8.11項「可変性」を参照してください。

121.17.1 TopLink Workbenchを使用した可変マッピングの構成方法

この表を使用して「オブジェクト -> Fieldメソッド」フィールドを指定します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

    図121-19 「トランスフォーメーション・マッピング」、「可変」オプション

    図121-19の説明が続きます
    「図121-19 「トランスフォーメーション・マッピング」、「可変」オプション」の説明

デフォルトでは、「可変」オプションが、すべてのトランスフォーメーション・マッピングで選択されます。マッピングで、基本的で単純な値をマップする場合は、このオプションの選択を解除します。

121.17.2 Javaを使用した可変マッピングの構成方法

マッピングを可変にするかどうかを指定するには、トランスフォーメーション・マッピングの場合はAbstractTransformationMappingメソッドsetIsMutableを、ダイレクト・マッピングの場合はAbstractDirectMappingメソッドisMutableを使用します。

121.18 双方向リレーションシップの構成

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.18.1 TopLink Workbenchを使用した双方向リレーションシップの構成方法

マッピングに双方向リレーションシップを設定するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-20 「一般」タブ、「双方向リレーションシップを維持」オプション

    図121-20の説明が続きます
    「図121-20 「一般」タブ、「双方向リレーションシップを維持」オプション」の説明

次の表に説明されているタブの各フィールドにデータを入力します。

フィールド 説明
双方向リレーションシップのメンテナンス TopLinkでこのリレーショナル・マッピングに双方向のリンクを設定する場合に指定します。
    リレーションシップ・パートナ この双方向リレーションシップのためのリレーションシップ・パートナを(「参照ディスクリプタ」のマップ済属性のリストから)選択します。

121.18.2 Javaを使用した双方向リレーションシップの構成方法

リレーションシップの2つのクラスが1対1マッピングによって相互に参照する双方向リレーションシップがマッピングにある場合(2.14.3.4項「双方向リレーションシップの維持」を参照)は、次のような外部キー情報を設定します。

  • マッピングの一方は、setForeignKeyFieldNameメソッドをコールする必要があります。

  • 他方のマッピングは、setTargetForeignKeyFieldNameメソッドをコールする必要があります。

また、addForeignKeyFieldNameメソッドおよびaddTargetForeignKeyFieldNameメソッドをコールして、複合外部キー情報を設定することもできます。TopLinkによりインダイレクション(遅延ロード)はデフォルトで有効であるため、属性はValueHolderInterfaceである必要があります。


注意:

アプリケーションでキャッシュを使用しない場合、双方向リレーションシップの少なくとも一方のオブジェクトに対してインダイレクションを有効にします。双方向リレーションシップの両方のオブジェクトについてインダイレクションを無効にすると、まれに無限ループになる可能性があります。詳細は、次を参照してください。

例121-18は、PolicyCarrierクラスの間の双方向リレーションシップの設定を示します。外部キーは、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.19 単独ノードの使用の構成

表121-20にまとめられているXMLベース・マッピングでは、リスト値をマップする場合、マッピングでリストをアンマーシャリング(書込み)する際、<item>aaa bbb ccc</item>のように1つのノードにするか、または次のように複数のノードにするかを構成できます。

<item>aaa</item>
<item>bbb</item>
<item>ccc</item>

表121-20では、どのマッピングがこのオプションをサポートしているかを示します。

脚注1 XMLレコードの使用時のみ(76.4項「レコード形式の構成」を参照)。

121.19.1 TopLink Workbenchを使用した単独ノードの使用の構成方法

単独ノードを使用するようにマッピングを構成するには、次の手順を実行します。

  1. ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。

  2. 「一般」タブをクリックします。「一般」タブが表示されます。

    図121-21 「一般」タブ、「単独ノードを使用」オプション

    図121-21の説明が続きます
    「図121-21 「一般」タブ、「単独ノードを使用」オプション」の説明

リスト値を単独ノード(<item>aaa bbb ccc</item>など)にアンマーシャリング(書込み)するようにマッピングを構成するには、「単独ノードを使用」をクリックします。

デフォルトでは、マッピングはリスト値を別々のノードにアンマーシャリングします。

121.19.2 Javaを使用した単独ノードの使用の構成方法

リスト値を単独ノードに書き込むようにマッピングを構成するには、AbstractCompositeDirectCollectionMappingメソッドsetUsesSingleNodetrueの値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、falseの値を渡します。

XMLFieldを取得するマッピングでは、リスト値を単独ノードに書き込むようにマッピングを構成するには、XMLFieldメソッドsetUsesSingleNodetrueの値を渡します。リスト値を複数のノードに書き込むようにマッピングを構成するには、falseの値を渡します。例121-19は、このメソッドをXMLDirectMappingで使用する方法を示します。

例121-19 XMLFieldメソッドsetUsesSingleNodeの使用

XMLDirectMapping tasksMapping = new XMLDirectMapping();
tasksMapping.setAttributeName("tasks");
XMLField myField = new XMLField("tasks/text()"); // pass in the XPath
myField.setUsesSingleNode(true);
tasksMapping.setField(myField);

121.20 CDATAの使用の構成

表121-21にまとめられているXMLベース・マッピングでは、マッピングを作成する場合、マッピングのテキストを<![CDATA[...]]>文にラップするかどうかを構成できます。

表121-21では、どのマッピングがこのオプションをサポートしているかを示します。

121.20.1 Javaを使用したCDATAの使用の構成方法

XMLDirectMappingまたはXMLCompositeDirectCollectionMappingに対してisCDATA()メソッドを使用して、マッピングのテキストを<![CDATA[...]]>文にラップするかどうかを指定します。

例121-20は、このメソッドの使用結果を示します。

例121-20 CDATAの使用

名前マッピングでisCDATA = falseの場合、TopLinkでは次のように標準のテキスト・ノードとしてテキストを書き込みます。

<employee>
  <name>Jane Doe</name>
</employee>

名前マッピングでisCDATA = trueの場合、TopLinkでは次のように<![CDATA[...]]>文にテキストをラップします。

<employee>
  <name>
    <![CDATA[Jane Doe]]>
  </name>
</employee>