Предоставление столбца дискриминатора в качестве свойства в файле hbm - PullRequest
2 голосов
/ 12 января 2012

В нашей системе есть таблица, в которой хранятся пары ключ / значение ресурса. Есть два столбца для хранения значения; столбец 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")

Ясно, что он не понимает, что я пытаюсь сделать, но имеет смысл, что должен быть способ сделать это. Итак, как вы выставляете поле дискриминатора как свойство?

Спасибо.

1 Ответ

2 голосов
/ 12 января 2012

Вы не можете этого сделать.У объекта есть тип, и он не может переключаться с одного типа на другой.Вот как работает Java.

Я думаю, у вас просто не должно быть двух типов сущностей здесь.Почему бы вам просто не сохранить дискриминатор в качестве базового столбца перечисления и сохранить / извлечь значение свойства в столбце varchar или clob на основе значения этого перечисления.Убедитесь, что все прозрачно заключено в объект, и все будет проще, даже для вызывающих.Поле enum даже не может быть обнародовано.Вы используете его для реализации getMessageValue() (получить значение из соответствующего столбца) и изменяете его значение при вызове setMessageValue(), основываясь на длине нового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...