| Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.1.2) E48005-01 |
|
![]() 前 |
![]() 次 |
@ClassExtractorを使用して、識別子列を提供するかわりに、カスタム・クラス・インジケータを定義します。
注釈要素
表2-10は、この注釈の要素を示しています。
使用方法
既存のデータベースにマップしており、表に識別子列がない場合、@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>
関連項目
詳細は、次を参照してください。
『Oracle TopLinkの理解』のエンティティに関する項