Таблица для конкретной иерархии классов в Hibernate - PullRequest
3 голосов
/ 04 января 2009

У меня есть следующее отображение Hibernate, которое должно отображаться с использованием таблицы для конкретной иерархии классов:

<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), адрес, noOfRooms, totalArea, цена)
  • земля (id_property (PK), адрес, площадь, цена за единицу)

Насколько я понял, в этом случае идентификаторы нужно явно генерировать перед вызовом .save (), поэтому мой вопрос: как я могу создать стратегию для автоматической генерации идентификаторов, чтобы идентификаторы конкретный класс образует непрерывную область при соединении.

Ответы [ 3 ]

3 голосов
/ 04 января 2009

ИМХО, ваша модель в БД неверна, поскольку у вас есть избыточная информация в нескольких связанных таблицах.

Таблица для конкретного класса - это модель наследования, которая создает проблемы во время выполнения, поскольку вы можете иметь ситуацию, когда вы обновляете адрес Земли, но не дома, в то время как они одинаковы (семантически). Iow: отбросьте эту модель и представьте таблицу на подкласс, так что у вас есть таблица свойств базы с идентификатором и адресом и две отдельные таблицы с PK, который представляет собой FK для базы данных свойств, один - дом с полями, специфичными для дома Другой - это земля с полями, специфичными для земли.

Это даст вам наименьшее количество проблем, поскольку это способ преобразования наследования между типами сущностей в реляционные таблицы (см. Книги Найссена / Халпина о NIAM / ORM)

1 голос
/ 04 января 2009

Я использовал следующее с join-subclass

<key column="id"/>

Это должно заставить подклассы использовать идентификаторы из таблицы свойств, поскольку это зависит от него. (супер) Столбец относится к столбцу в подклассе, который является внешней ссылкой на супер.

0 голосов
/ 30 января 2009

Решение - создать еще одну таблицу, в которой будет храниться следующий идентификатор; это значение следует изменять каждый раз, когда пользователь хочет вставить новый объект. Таким образом, домен является непрерывным

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