Таблица для каждой конкретной иерархии классов в режиме гибернации
-
03-07-2019 - |
Вопрос
У меня есть следующее отображение гибернации, которое должно быть сопоставлено с использованием таблицы для каждой конкретной иерархии классов:
<hibernate-mapping package='dao'>
<meta attribute='class-description'></meta>
<class name='PropertyDAO'>
<id name='id' column='id_property'>
<generator class='assigned'/>
</id>
<property name='address' column='address' type='string'/>
<union-subclass name='HouseDAO' table='house'>
<property name='noOfRooms' column='noOfRooms'/>
<property name='totalArea' column='totalArea'/>
<property name='price' column='price'/>
</union-subclass>
<union-subclass name='LandDAO' table='land'>
<property name='area' column='area'/>
<property name='unitPrice' column='unitPrice'/>
</union-subclass>
</class>
</hibernate-mapping>
Это означает, что в базе данных у меня есть только 2 таблицы :
- дом (id_property (PK), адрес, количество комнат, общая площадь, цена)
- земельный участок (id_property (PK), адрес, площадь, цена единицы измерения)
Насколько я понял, в этом случае идентификаторы должны быть сгенерированы явно перед вызовом .save(), поэтому мой вопрос таков:Как я могу создать стратегию для автоматической генерации идентификаторов, чтобы идентификаторы из конкретного класса при объединении образовывали непрерывный домен?
Решение 3
Решение состоит в том, чтобы создать другую таблицу, в которой хранится следующий идентификатор;это значение должно изменяться каждый раз, когда пользователь хочет вставить новый объект.Таким образом, домен является непрерывным
Другие советы
ИМХО, ваша модель в БД неверна, поскольку у вас есть избыточная информация в нескольких связанных таблицах.
Таблица для каждого конкретного класса - это модель наследования, которая создает проблемы во время выполнения, поскольку у вас может возникнуть ситуация, когда кто-то обновляет адрес земли, но не дома, хотя они одинаковы (семантически).Ввод в эксплуатацию.:отбросьте эту модель и введите таблицу для каждого подкласса, чтобы у вас была базовая таблица свойств с идентификатором и адресом и две отдельные таблицы с PK, которая является FK для pk базы свойств, одна - house с полями, специфичными для дома, другая - land с полями, специфичными для земли.
Это создаст вам наименьшее количество проблем, поскольку это способ преобразования наследования между типами сущностей в реляционные таблицы (см. Книги Найссена / Халпина о NIAM / ORM)
Я использовал следующее с joined-подклассом
<key column="id"/>
Это должно заставить подклассы использовать идентификаторы из таблицы свойств, поскольку это зависит от нее.(super) Столбец ссылается на столбец в подклассе, который является внешней ссылкой на super.