DiscriminatorFormula является альтернативой DiscriminatorColumn. Вы аннотируете суперкласс (который отображает реальную таблицу по умолчанию) с одним из них.
С 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, чтобы делать то, что вам нужно.
Вы можете выбрать один из этих двух вариантов, и подклассы в обоих случаях абсолютно одинаковы.
В подклассах вы указываете значение дискриминатора, например:
@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)
С этой аннотацией или без нее вы получаете одну таблицу под названием «Функции».