Решением, которое я выбрал для этого, является отображение таблицы на иерархию классов с целочисленным дискриминатором.
Я создал базовый абстрактный обобщенный класс, в котором хранится объект
public abstract class ValueBase<T> {
private Long id;
private int valueType;
private T value;
public T getValue(){
return value;
}
public void setValue(T value){
this.value = value;
}
protected void setValueType(int valueType) {
this.valueType = valueType;
}
public int getValueType(){
return this.valueType;
}
private void setID(Long id) {
this.id = id;
}
public int getID(){
return this.id;
}
}
Для управления типами я создал и интерфейс, но есть возможность перечисления с использованием инкапсуляции, представленной Артуром.
public interface IValueTypes() {
public static final int NONE = -1;
public static final int NUMERIC = 0;
public static final int CHARACTER = 1;
public static final int DATE = 2;
public static final int TIME = 3;
public static final int BOOLEAN = 4;
}
Класс для каждого типа, который я создал,
public class NumericType extedns ValueBase<BigDecinal> {
public NumericType(){
super();
setValueType(IValueTypes.NUMERIC);
}
}
public class CharacterType extedns ValueBase<String> {
public NumericType(){
super();
setValueType(IValueTypes.CHARACTER);
}
}
СОВЕТ: Чтобы разрешить использовать число в качестве значения дискриминатора, нам нужно сначала указать его для отображаемого нами класса, потому что по умолчанию используется имя класса [String] и мы пытаемся использовать числовой дискриминатор для отображения подклассов, мы получим ошибку гибернации, которая говорит о некотором несоответствии типов.
<class name="TestValue" table="TestValues" schema="TEST" abstract="true" discriminator-value="-1">
<id name="id" type="java.lang.Long">
<column name="VALUE_ID" precision="22" scale="0" />
<generator class="native"/>
</id>
<discriminator column="TYPE_VALUE" not-null="false" type="integer"/>
<subclass discriminator-value="0" name="NumericType">
<property name="value" type="java.math.BigDecimal" column="NUMERIC" not-null="false"/>
</subclass>
<subclass discriminator-value="1" name="CharacterType">
<property name="value" type="java.lang.String" column="CHARACTER" not-null="false"/>
</subclass>
</class>
Пока мы извлекаем объект из базы данных, он всегда находится в заданном типизированном классе, и мы можем легко с ним работать, и мы используем одно место для его сохранения, сохраняя базовый класс.