DiscriminatorFormulaは、DiscriminatorColumnの代替手段です。スーパークラス(デフォルトとして実際のテーブルをマップする)にそれらの1つで注釈を付けます。DiscriminatorColumnを使用すると、ディスクリミネーター値を含む追加の列(デフォルトでは「dtype」と呼ばれます)が作成されます。注釈をスーパークラスに配置します。
@Entity
@Table(name = "features")
@DiscriminatorColumn
public class Features{
//valid code
}
DiscriminatorFormulaを使用すると、データベースの行の内容を確認し、ディスクリミネーターの値でサブクラスを「選択」できます。追加の(「dtype」)列は作成されません。メインクラスでは、次のようにスーパークラスに式で注釈を付けます。
@Entity
@Table(name = "features")
@DiscriminatorFormula(
"CASE WHEN num_value IS NOT NULL THEN 'NUMERIC' " +
" WHEN txt_value IS NOT NULL THEN 'TEXT' end"
)
public class Features{
//valid code
}
DiscriminatorFormulaでは、必要なことを実行するために純粋なSQLを配置するだけです。
これらの2つのオプションのいずれかを選択でき、サブクラスはどちらの場合もまったく同じです。サブクラスでは、次のように識別子の値を指定します。
@Entity
@DiscriminatorValue('NUMERIC')
public class NumericFeatures extends Features {
private Double numValue;
public Double getNumValue() {
return numValue;
}
public void setNumValue(Double numValue) {
this.numValue = numValue;
}
//valid code
}
「features」というテーブルには、対応する値を含む「num_value」列と「txt_value」列の両方があります。DiscriminatorColumnを使用すると、追加のdtype列に「NUMERIC」または「TEXT」の値があり、「num_value」列と「txt_value」列の両方があります。
継承戦略を指定しない場合、デフォルトは「SINGLE_TYPE」です。選択した戦略の場合は、次の注釈を省略できます。
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
このアノテーションの有無にかかわらず、「機能」と呼ばれる1つのテーブルを取得します。