2015-10-15 3 views
1

Я работаю над веб-проектом Maven Java на основе Spring, JPA и Hibernate.Наследование сущностей JPA без дополнительных таблиц

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

@Service 
public class MessageService 

@Entity 
public class Message 

Оба проекта имеют сходные, но немного разные UserEntities.

@Entity 
public class TypeAUser 
@Entity 
public class TypeBUser 

The Message Entity имеет @OneToMany отношение к одному из UserEntities в каждом проекте.

Я думал о универсальном UserEntity, но хочу избежать создания дополнительных таблиц, а также таблиц с полями «другого» проекта.

Любые идеи приветствуются.

С наилучшими пожеланиями, Стефан

ответ

2

Если вы не хотите создавать дополнительные таблицы, то вы, возможно, захотите рассмотреть вопрос об использовании SINGLE_TABLE strategy.

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class UserEntity { 
... 
} 

@Entity 
public class TypeAUser extends UserEntity { 
... 
} 

@Entity 
public class TypeBUser extends UserEntity { 
... 
} 
+0

Ну дон «Не хочу, чтобы у них была одинаковая идентичность или та же таблица, что и два отдельных проекта с двумя отдельными базами данных, которые просто используют этот один модуль maven. – stefan2k

1

Ну, когда речь идет о наследовании в спящем режиме, у вас есть три варианта:

  1. Таблица на класс бетона с профсоюзами
  2. Tab ле в иерархии классов (Single Table Strategy)
  3. Таблицы на подкласс

Поскольку вы хотите достичь его с одним столом, я предлагаю использовать вариант 2.

Вам нужен только стол пользователя, с USER_TYPE столбец различать типы пользователей (может быть числом, varchar2 и т.д.)

Затем вам нужно создать класс пользователя со следующими примечаниями: вы можете указать DiscriminatorColumn, если вы хотите, в противном случае Hibernate по умолчанию в '{className}_TYPE

@Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="USER_TYPE", discriminatorType=DiscriminatorType.STRING) public class User { .... }

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

@Entity @DiscriminatorValue('A') public class TypeAUser @Entity @DiscriminatorValue('B') public class TypeBUser

+0

Просто записка. '@ DiscriminatorColumn' и' @ DiscriminatorValue' не являются обязательными аннотациями (но это хорошо). Если объект суперкласса имеет имя «Пользователь», то столбец дискриминатора будет «USER_TYPE», который будет иметь тип String. '@ DiscriminatorValue' будет по умолчанию' 'TypeAUser'' и' 'TypeBUser''. – Ish

+0

о, хорошо, приятно знать! Я отредактировал свой ответ на основе вашего комментария. Спасибо! – javaguest

Смежные вопросы