Hibernate OneToMany без внешнего ключа - PullRequest
2 голосов
/ 08 июля 2011

Есть ли способ сказать JPA не создавать внешний ключ в отношении OneToMany при создании таблиц?Вот пример кода того, что я пытаюсь сделать:

У меня есть две сущности, называемые Project и Group.Каждый проект может содержать много блогов, и каждая группа может содержать много блогов.Однако существует только одна таблица блогов, в которой хранятся все блоги.В таблице блогов есть столбец containerId, в котором содержится идентификатор родительского контейнера.Например, если блог принадлежит группе с идентификатором 100, столбец containerId для блога содержит значение 100.

@OneToMany(fetch=FetchType.EAGER, mappedBy="containerId")
@Where(clause="containertype=600")
public Set<BlogEntity> getBlogs() {
    return blogs;
}

Когда я пытаюсь вставить блог в таблицу блогов с допустимым идентификатором группы,Я получаю сообщение об ошибке гибернации, говорящее «Нарушение ограничения целостности - нет родительской таблицы FK84B5A4F0388ED18F: PROJECT в операторе».Похоже, и Project, и Group пытались создать внешний ключ в одном столбце (containerId) в таблице блога.Как мне обойти эту проблему?

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Прежде всего, вы не обязаны создавать свои таблицы в Hibernate. Вы можете использовать собственный скрипт SQL.

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

Я бы либо использовал два столбца (group_id и project_id) в таблице блога, либо использовал две таблицы объединения (group_blogs и project_blogs). Это сделало бы Hibernate счастливым и улучшило бы базу данных.

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

Тем не менее, если вы действительно хотите сохранить этот дизайн, я думаю, что ключ заключается в том, чтобы использовать аннотацию @Any для отображения обратных отношений (от блога до группы / проекта).

0 голосов
/ 08 июля 2011

Имея один столбец, ContainerID в таблице Blag, на мой взгляд, является плохим подходом. Было бы лучше создать две разные таблицы для объединения таблицы блога с двумя разными таблицами. Вы можете иметь таблицу BlogProject и таблицу BlogGroup. Каждый из них будет иметь BlogID и ProjectID или GroupID соответственно. Эти таблицы будут вашим индикатором того, где блоги отображаются. Это тот же подход, который вы бы использовали в отношениях ManyToMany.

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