2012-01-29 38 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