Устаревшее отображение с гибернацией - PullRequest
0 голосов
/ 03 марта 2009

В моем текущем проекте мне нужно сопоставить устаревшую базу данных с помощью hibernate, но у меня возникают некоторые проблемы. База данных настраивается с использованием одной таблицы «сущностей», которая содержит общие свойства для всех объектов домена. Свойства включают (среди прочего) дату создания, владельца (пользователя) и первичный ключ, который впоследствии используется в таблицах для объектов домена.

Простое представление контекста таково:

table entity
 - int id
 - varchar owner

table account
 - int accountid (references entity.id)

table contact
 - int contactid (references entity.id)
 - int accountid (references account.accountid)

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

<hibernate-mapping>
    <class name="Contact" table="entity">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <join table="contact">
            <key column="contactid"/>
            <!-- more stuff -->
        </join> 
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="Account" table="entity">
        <id name="id" column="id">
            <generator class="native" />
        </id>


        <bag name="contacts" table="contact">
            <key column="accountid" />
            <one-to-many class="Contact"/>
        </bag> 

        <join table="account">
            <key column="accountid"/>
            <!-- more stuff -->
        </join>

    </class>
</hibernate-mapping>

Однако, когда я пытаюсь получить учетную запись, я получаю ошибку SQL, утверждающую, что таблица сущностей не содержит столбец с именем accountid. Я понимаю, почему это происходит: сопоставление пытается найти столбец accountid в таблице сущностей, когда я хочу, чтобы он смотрел в таблице контактов. Я что-то упускаю здесь очевидное, или я должен подойти к этой проблеме с другой стороны?

1 Ответ

3 голосов
/ 03 марта 2009

Мне кажется, что вам действительно нужно отобразить наследование, используя парадигму Table Per Subclass.

Примерно так:

<class name="entity" table="entity">
    <id name="id" column="id">
        ...
    </id>

    <joined-subclass name="contact" table="contact">
        <key column="contactid"/>
    </joined-subclass>

    <joined-subclass name="account" table="account">
        <key column="accountid"/>
    </joined-subclass>
</class>

Кстати, это приблизительно - подробно описано в разделе 9.1.2 документации по Hibernate (на случай, если вы не можете его найти, оно называется «Таблица на подкласс»).

Приветствия

Rich

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