Отношение один к одному между одним типом и подклассами другого типа с использованием Hibernate - PullRequest
0 голосов
/ 21 апреля 2011

Используя Hibernate, я пытаюсь реализовать взаимно-однозначное отношение между одним фиксированным типом домена A и другим типом домена B, тип которого является любым типом, который реализует определенный интерфейс.

Ситуация:

Система имеет три разных типа домена;Страна, Склад и Магазин, которые реализуют интерфейс FlagSubscriber.

Я хотел бы присоединиться к FlagSubscribeers с Flags.Каждый флаг может быть связан с 0 или 1 флагом подписчиков.

Реализация:

В базе данных у меня есть таблицы для страны, склада, магазина и флага, каждый из которых имеет идентификаторстолбец и различные другие столбцы для их конкретных атрибутов.Чтобы соединить флаги с FlagSubscribeers, я создал таблицу ссылок, которая выглядит следующим образом:

  • flag_id
  • subscriber_id
  • subscriber_type

Идентификационные поля не требуют пояснений, subscriber_type - это текстовое поле, которое определяет, относится ли subscriber_id к стране, складу или магазину.

Вопрос:

ИспользованиеАннотации Hibernate, как мне сообщить Hibernate, как сопоставить FlagSubscribeers в классе Flag?

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

Любые ссылки на примеры, предложения или идеи приветствуются!

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Возможно, его можно отобразить с помощью @Any аннотации , хотя я не уверен, как бы он играл с таблицей ссылок. Однако, поскольку отношения между Flag и FlagSubscriber являются взаимно-однозначными, вы можете сопоставить их без таблицы ссылок.

Также обратите внимание, что он не будет работать с Hibernate 3.5, если Hibernate используется через интерфейс EntityManager.

0 голосов
/ 21 апреля 2011

Я бы пошел на другую настройку:

Нет интерфейса FlagSubscriber, но есть (абстрактный) класс с 3 подклассами: Store, Warehouse и Country. Все общие поля могут быть перемещены в FlagSubscriber, но я предполагаю, что это может быть ограничено

@ ManyToOne частный флаг;

Затем вы можете выбрать отдельную таблицу FlagSubscriber, которая будет содержать subscriber_id и внешний ключ для Table Table. Каждый подкласс FlagSubscriber также будет иметь свою собственную таблицу с таким же идентификатором. В этом случае нет необходимости в дискриминаторах, поскольку hibernate будет объединяться со всеми подклассами, чтобы знать, какой тип (подкласс) он на самом деле (в случае идентификатора он сможет достичь успеха.

...