Отображение гибернации для таблицы без первичного ключа - PullRequest
4 голосов
/ 17 августа 2010

Я знаю, что этот вопрос уже задавался, но у меня тоже есть вопрос по дизайну.

Есть две таблицы, например:

Table Group_table
column pk_Group_name
column group_type
etc

Table Group_members
column fk_group_name -> foreign key to group_table
column group_member

С этой структурой легко работать, но у меня есть два вопроса. Во-первых, как мне сопоставить group_members в отображении Hibernate? Hibernate хочет какой-то идентификатор, и я не уверен, что сказать.

Во-вторых, хотя, возможно, мне следует сначала спросить, это плохой дизайн БД? Должен ли быть pk в таблице group_members, например, последовательность или что-то в этом роде?

Кроме того, это база данных Oracle: есть ли какой-нибудь автоматически сгенерированный идентификатор, который я могу использовать, несмотря на (возможно) плохой дизайн базы данных?

Ответы [ 2 ]

3 голосов
/ 17 августа 2010
  1. Всегда добавляйте PK.
  2. Никогда не используйте бизнес-ключ (например, имя) в качестве внешнего ключа.Что произойдет, если пользователь женится?Или группа переименовывает себя?Всегда используйте PK.
  3. Hibernate справится с этим для вас.Просто добавьте столбец ID и отобразите его как «нативный» ( см. Документы )
2 голосов
/ 17 августа 2010

Вам абсолютно необходим идентификатор в отображении, который описывает уникальность строки: по PK, назначенному или составному.В вашем случае вы можете использовать composite-id:

<class name="eg.Foo" table"FOOS">
    <composite-id name="compId" class="eg.FooCompositeID">
        <key-property name="string"/>
        <key-property name="short"/>
    </composite-id>
    <property name="name"/>
    ....
</class>

Конечно, это предполагает, что пара (fk_group_name, group_member) уникальна.Но это не идеально, у вас должен быть PK.

Ссылка

...