Отображение столбца дискриминатора как свойства в файле hbm

StackOverflow https://stackoverflow.com/questions/8827085

Вопрос

У нас есть таблица в нашей системе, в которой хранятся пары ключ / значение ресурса. Есть два столбца для хранения значения; столбец VARCHAR для меньших значений и CLOB для больших значений. На стороне Java они создаются в одном из двух классов, StandardResourceBundleValue или LargeResourceBundleValue, а столбец дискриминатора используется для их различения в одной таблице:

родовое слово

Вот самое интересное: если значение ключа изначально было маленьким (и сохранялось как StandardResourceBundleValue), то значение изменилось на единицу больше, чем VARCHAR, нам нужен способ преобразовать его в StandardResourceBundleValue. Код, в котором это происходит, не может просто удалить StandardResourceBundleValue и создать LargeResourceBundleValue, потому что это вызывает нарушения ограничений.

Что мы хотели бы сделать, так это определить свойство для этого столбца дискриминатора, чтобы базовый класс мог иметь метод, который изменяет это значение в объекте, чтобы при его повторном сохранении значение сохранялось в CLOB. родовое слово

Когда я пытаюсь построить таблицу, я получаю следующую ошибку:

<цитата>

Повторяющийся столбец в сопоставлении для объекта: com.foo.resourcebundle.LargeResourceBundleValue столбец: RESOURCE_TYPE (должен быть сопоставлен с помощью insert="false" update="false")

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

Спасибо.

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top