Hibernate наследование с использованием одной таблицы - PullRequest
1 голос
/ 19 ноября 2011

в нашей системе мы храним заказы.У нас всегда есть специфический для клиента код в наших проектах, но мы стараемся максимально стандартизировать.Сейчас я настраиваю тест с Hibernate, чтобы посмотреть, сможем ли мы использовать его для улучшения наших объектов доступа к данным.У меня есть некоторые проблемы с пониманием возможностей наследования в Hibernate.Позвольте мне изложить проблему:

У нас есть 4 уровня программного обеспечения:

  1. базовая библиотека
  2. библиотека для конкретного клиента (расширения на ядре)
  3. приложение (приложение, использующее как основную, так и специфичную для клиента библиотеку)
  4. база данных

базовая библиотека

В базовой библиотеке имеется следующая модель в отношении заказов

  1. IOrder (интерфейс)
  2. Порядок (класс, реализация основного порядка, реализация по умолчанию)

Предположим, что в Ордере есть следующие поля по умолчанию:

  • ID
  • CUSTOMER_NAME
  • ORDER_DATE
  • DELIVERY_DATE

Библиотека, специфичная для клиента

В библиотеке, специфичной для клиентаУ нас есть следующее в отношении заказа:

  1. CustomerOrder (класс, расширение для заказа).

Теперь клиент, заказывающий нашу систему, также хочет сохранить страну и приоритет дополнительнок вышеуказанным полям.Специфичные для клиента поля:

  • СТРАНА
  • ПРИОРИТЕТ

Приложение

Приложение загружает правильный класс Заказа (либо Заказили CustomerOrder) через фабрику.Фабрика каким-то образом знает, есть ли конкретная реализация для клиента.

База данных

В базе данных мы хотели бы иметь 1 таблицу (из соображений производительности), нашу таблицу ядра / таблицы по умолчанию (поэтому без каких-либорасширение клиента) выглядит следующим образом:

create table ORDER
(
    OR_ID VARCHAR2(10) not null constraint OR_ID_PK primary key,
    OR_CUSTOMER_NAME VARCHAR2(20),
    OR_ORDER_DATE datetime,
    OR_DELIVERY_DATE datetime
);

Для клиента, которому требуются дополнительные два поля, мы создали бы такую ​​же таблицу:

create table ORDER
(
    OR_ID VARCHAR2(10) not null constraint OR_ID_PK primary key,
    OR_CUSTOMER_NAME VARCHAR2(20),
    OR_ORDER_DATE datetime,
    OR_DELIVERY_DATE datetime,
    OR_COUNTRY VARCHAR2(20),
    OR_PRIORITY NUMBER
);

Java / Hibernate

Теперь моя проблема в том, как я могу смоделировать это в Java, используя Hibernate, используя только 1 таблицу.Базовая сущность Order не знает ни о каких дополнительных столбцах, доступных в CustomerOrder.Я исследовал некоторые варианты Hibernate в сочетании с наследованием, например, используя стратегию InheritanceType.SINGLE_TABLE.Но я считаю, что для этого требуется столбец дискриминатора, которого у меня нет.

Какие у меня есть варианты с Hibernate?

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Не знаю, правильно ли я понял, но, похоже, у вас есть два класса Order и CustomerOrder, которые наследуют Order. Если это так, то стратегия для одной таблицы хорошо подходит без какой-либо конфигурации, а столбец дискриминатора - это имя класса, поэтому, если запись принадлежит Order, вы получите Order в качестве значения дискриминатора, а если это CustomerOrder, вы получите CustomerOrder как значение дискриминатора. Это поведение по умолчанию для спящего режима, и вы можете изменить его.

1 голос
/ 19 ноября 2011

В этом случае у вас никогда не будет двух видов сущностей одновременно (Order и CustomerOrder). У вас есть только Заказы, если нет настройки, и у вас есть только CustomerOrders, если есть настройка.

И на самом деле вы можете предположить, что у вас всегда есть только CustomerOrder, но этот класс не полностью находится под вашим контролем и может быть заменен другим классом от клиента.

Таким образом, я бы, вероятно, сделал Order MappedSuperclass (то есть класс, который не представляет собой сущность, но имеет постоянные поля, которые наследуются сущностями).

В расширении jar, которое может быть настроено клиентом, я бы определил сущность CustomerOrder, которая будет просто расширять Order и не добавлять никаких других полей. Этот класс CustomerOrder будет доступен в исходной форме для клиентов, которые могут заменить его собственной реализацией с дополнительными полями.

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