ORM - отношение ManyToMany на MappedSuperclass - PullRequest
3 голосов
/ 29 января 2012

У меня есть следующие классы:

AnimalClass [Id, Name, Set<Tag>]
|
+-- FishClass [FishSpecific]
+-- MammalClass [MammalSpecific]

Tag [Name]

Таким образом, любое животное может иметь любое количество связанных тегов.

Для этого я использую в AnimalClass:

@JoinTable(name="Animal_Tag")
@JoinColumn(name="animal_id", referencedColumnName="id", nullable=false)
@OneToMany(cascade=CascadeType.ALL)
@Getter
protected Set<Tag> tags = new HashSet<Tag>();

Моя проблема в том, что Hibernate создает таблицу m-n как:

 Animal_Tag [FishClass_id, MammalClass_id, Tag_id]. 

Я бы предпочел иметь какое-то перечисление как:

 Animal_Tag [Animal_id, AnimalTypeEnumeration[ Fish | Mammal ], Tag_id].

Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 января 2012

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

Суть сопоставленного суперкласса в том, что он не определяет постоянный тип. Он определяет своего рода шаблон для постоянных типов. Каждый раз, когда вы определяете его подкласс, который аннотируется @Entity, вы создаете экземпляр шаблона, но в модели данных нет связи между этими типами. Использование сопоставленного суперкласса является почти ярлыком для копирования и вставки заданного набора полей в новый класс сущностей.

Таким образом, что касается модели данных, то там нет возможных animal_id, потому что нет такого типа, как animal. В базе данных присутствуют только рыбы и млекопитающие.

Можете ли вы сделать AnimalClass сущностью вместо сопоставленного суперкласса? Если вы используете стратегию наследования таблиц для класса, вам не нужно будет создавать для нее таблицу. Но это сделает животных типом, что означает, что ORM сможет использовать animal_id.

2 голосов
/ 29 января 2012

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

Полиморфизм с ORM всегда сложен. Лучше всего избегать этого, если можете. В противном случае, может быть, вы могли бы использовать @Inheritance(strategy=InheritanceType.JOINED) на животных? Это приведет к такой структуре таблицы:

TABLE Animal
 - id (primary key)

TABLE Fish
 - id (foreign key -> Animal)
 - fins
 - scales

TABLE Mammal
 - id (foreign key -> Animal)
 - mammaries 
1 голос
/ 29 января 2012

Может быть использовать наследование "таблица на подкласс с дискриминатором" для AnimalClass?В случае гибернации это приводит к fowing hirecaly:

AnimalClass [Id, AnimalTypeEnumeration (discriminator), Name]
|
+-- FishClass [FishSpecific]
+-- MammalClass [MammalSpecific]
Animal_Tag [Animal_id, Tag_id]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...