В нашей системе есть таблица, в которой хранятся пары ключ / значение ресурса. Есть два столбца для хранения значения; столбец VARCHAR для меньших значений и CLOB для больших значений. На стороне Java они создаются в одном из двух классов, StandardResourceBundleValue или LargeResourceBundleValue, и для их различения в одной таблице используется столбец дискриминатора:
<discriminator type="string">
<column name="RESOURCE_TYPE" length="20" index="XIE1CPD_RESOURCE_BUNDLE_L_V"/>
</discriminator>
...
<subclass name="StandardResourceBundleValue" discriminator-value="STANDARD">
<property name="messageValue" type="string" column="STD_MSG_VALUE" length="400"/>
</subclass>
<subclass name="LargeResourceBundleValue" discriminator-value="LARGE">
<property name="messageValue" type="materialized_clob" column="LARGE_MSG_VALUE"/>
</subclass>
Вот забавная часть: если значение ключа начиналось с малого (и сохранялось как StandardResourceBundleValue), то значение меняется на значение, большее, чем VARCHAR, нам нужен способ преобразовать его в StandardResourceBundleValue. Код, в котором это происходит, не может просто удалить StandardResourceBundleValue и создать LargeResourceBundleValue, потому что это вызывает нарушения ограничений.
Что бы мы хотели сделать, это определить свойство для этого столбца дискриминатора, чтобы у базового класса был метод, который изменяет это значение в объекте, поэтому при повторном сохранении он сохранит значение в CLOB. *
<property name="resourceType" type="string">
<column name="RESOURCE_TYPE"/>
</property>
Когда я пытаюсь построить таблицу, я получаю следующую ошибку:
Повторный столбец в сопоставлении для сущности:
столбец com.foo.resourcebundle.LargeResourceBundleValue:
RESOURCE_TYPE (должен отображаться с помощью insert = "false" update = "false")
Ясно, что он не понимает, что я пытаюсь сделать, но имеет смысл, что должен быть способ сделать это. Итак, как вы выставляете поле дискриминатора как свойство?
Спасибо.