(...) До недавнего времени в приложении был один постоянный класс, A:
со следующим представлением базы данных:
ID NAME
-- ----
1 foo
2 bar
С тех пор я добавил подкласс A, называемый B (...)
И вы не указали аннотацию Inheritance
, поэтому отображение SINGLE_TABLE
стратегия используется.И В этой стратегии все классы в иерархии отображаются в одну таблицу.В таблице есть столбец, который служит «столбцом дискриминатора», то есть столбцом, значение которого идентифицирует конкретный подкласс, которому принадлежит экземпляр, представленный строкой.
Таблица затем стала:
ID NAME DTYPE
-- ---- -----
1 foo NULL
2 bar NULL
Где DTYPE - имя столбца по умолчанию, которое будет использоваться для дискриминатора.
После добавления B я теперь не мог загружать A.Было сгенерировано следующее исключение (...)
Действительно, поскольку существующие значения имеют нулевое значение в столбце дискриминатора, поставщик не знает, какой подкласс создать.
Я добавил следующую аннотацию и свойство в B, и, похоже, это решило проблему.Это правильный способ решения проблемы?
Это один из способов, но он навязчив (ваши сущности не должны знать о столбце dtype
) и специфичен для Hibernate.Другими словами, это взломать.
Для меня «правильный» способ решить эту проблему - обновить столбец DTYPE
существующих записей A, чтобы установить значение 'A'
(в Hibernate значением по умолчанию является имя объекта):
UPDATE A SET DTYPE='A' WHERE DTYPE=NULL
Таким образом, Hibernate сможет загрузить их правильно.