2012-01-29 34 views
2

多對多關係,我有一個類如下:ORM - 上MappedSuperclass

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的創建MN表:

Animal_Tag [FishClass_id, MammalClass_id, Tag_id]. 

我寧願有某種枚舉爲:

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

謝謝!

回答

2

我懷疑你不能用映射超類來做到這一點。

約映射超的事情是,它沒有定義持久型。它爲持久類型定義了一種模板。每次定義一個註釋爲@Entity的子類時,都會創建該模板的一個實例,但在數據模型中,這些類型之間沒有關係。映射超類的使用幾乎是將給定字段集複製並粘貼到新實體類中的快捷方式。

所以,只要數據模型而言,有沒有可能animal_id,因爲沒有這種類型的動物。只有魚和哺乳動物存在於數據庫中。

你能AnimalClass一個實體,而不是一個映射的超?如果您使用每類繼承策略,則不需要爲其創建表。但它會使動物成爲一種類型,這意味着ORM將能夠使用animal_id。

+0

我不能使用超類作爲@Entity,因爲模式事實上要複雜得多(4個繼承類加入其他繼承類)。問題是我在這裏試圖達到的是與我想要用類的其他部分實現的完全相反 - 在這裏我想要Animal_Tag,但是在其他變量中,我需要爲inst完全分離。魚_照片和哺乳動物_照片。 – 2012-01-29 21:57:31

+0

您可以通過在魚類和哺乳動物類中聲明它們的變量,而不是基類來分離魚類和哺乳動物的照片。你可以有一個映射的超類,它是一個實體的孩子嗎?你可以有一個動物實體,然後是一個擴展它的脊椎動物映射超類,然後魚和動物可以擴展它。這可能有點麻煩,但它可能會解決問題。 – 2012-01-29 22:36:10

1

可能繼承使用「每個子類王氏鑑表」爲AnimalClass?在冬眠的情況下,它會導致僱傭:

AnimalClass [Id, AnimalTypeEnumeration (discriminator), Name] 
| 
+-- FishClass [FishSpecific] 
+-- MammalClass [MammalSpecific] 
Animal_Tag [Animal_id, Tag_id] 
+0

問題是我不能使用超類作爲@Entity - 請閱讀我對Tom Anderson的評論。 – 2012-01-29 21:58:50

2

想要將有一個外鍵可以指向不同的表,根據另一個字段的值的表結構。我不認爲任何數據庫都允許這樣做。

帶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 
+0

順便說一句,我正在談論JPA註釋 - 我只注意到你正在使用Hibernate註釋。我不知道Hibernate的等價物是什麼。 – 2012-01-29 18:02:05

+0

JPA註釋與Hibernate相同。請閱讀我爲之前的答案寫的評論。 – 2012-01-29 21:58:06