ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス
12c (12.1.2)
E48005-01
  目次へ移動
目次

前
 
次
 

@ClassExtractor

@ClassExtractorを使用して、識別子列を提供するかわりに、カスタム・クラス・インジケータを定義します。

注釈要素

表2-10は、この注釈の要素を示しています。

表2-10 @ClassExtractorの注釈要素

注釈要素 説明 デフォルト

java.lang.Class

(必須)エンティティのディスクリプタに適用するクラス・エクストラクタの名前



使用方法

既存のデータベースにマップしており、表に識別子列がない場合、@ClassExtractor注釈または<class-extractor>要素を使用して継承を定義できます。クラス・エクストラクタは、ClassExtractorインタフェースを実装するクラスを取得します。このクラスのインスタンスは、データベース行に使用するクラス・タイプの決定に使用されます。クラス・エクストラクタは、データベースRecordおよびSessionを取得するextractClassFromRowメソッドを定義する必要があります。

クラス・エクストラクタがSINGLE_TABLE継承とともに使用される場合、問合せでクラス・タイプの行をフィルタリングできる必要があります。これは、ブランチ・クラスのonlyInstancesExpressionまたはwithAllSubclassesExpressionを設定することによって実現できます。これらは、DescriptorCustomizerを使用してExpressionオブジェクトに設定できます。

例2-23に、ClassExtractorを使用して継承を定義する例を示します。

例2-23 @ClassExtractor注釈の使用

@Entity
@Table(name="MILES_ACCOUNT")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@ClassExtractor(AirMilesClassExtractor.class)
@Customizer(AirMilesCustomizer.class)
public class AirMilesAccount implements Serializable {
    @Id
    private Long id;
    @Basic
    private String totalMiles;
    @Basic
    private String milesBalance;
    ...
}
 
@Entity
@Customizer(PreferredCustomizer.class)
public class PreferredAccount extends AirMilesAccount {
    ...
}
 
public class AirMilesClassExtractor implements ClassExtractor {
    public void extractClassFromRow(Record row, Session session) {
        if (row.get("TOTALMILES").lessThan(100000)) {
            return AirMilesAccount.class;
        } else {
            return PreferredAccount.class;
        }
    }
}
 
public class AirMilesCustomizer implements DescriptorCustomizer {
    public void customize(ClassDescriptor descriptor) {
        ExpressionBuilder account = new ExpressionBuilder();
        Expression expression = account.getField("TOTALMILES").lessThan(100000);
        descriptor.getInheritancePolicy().setOnlyInstancesExpression(expression);
    }
}
 
public class PreferredCustomizer implements DescriptorCustomizer {
    public void customize(ClassDescriptor descriptor) {
        ExpressionBuilder account = new ExpressionBuilder();
        Expression expression = account.getField("TOTALMILES").greaterThanEqual(100000);
        descriptor.getInheritancePolicy().setOnlyInstancesExpression(expression);
    }
}

例2-24に、eclipselink-orm.xmlファイルの<class-extractor>要素を使用する方法を示します。

例2-24 <class-extractor> XMLの使用

<entity class="AirMilesAccount">
    <table name="MILES_ACCOUNT"/>
    <inheritance strategy="SINGLE_TABLE"/>
    <class-extractor class="AirMilesClassExtractor"/>
...
</entity>
 
<entity class="PreferredAccount">
    <customizer class="PreferredCustomizer"/>
...
</entity>

関連項目

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