ORM - MappedSuperclass 上的多对多关系

Voj*_*ěch 5 java orm hibernate

我有一个课程如下:

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

Tag [Name]
Run Code Online (Sandbox Code Playgroud)

因此任何动物都可以有任意数量的关联标签。

为此,我在 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>();
Run Code Online (Sandbox Code Playgroud)

我的问题是,Hibernate 将 mn 表创建为:

 Animal_Tag [FishClass_id, MammalClass_id, Tag_id]. 
Run Code Online (Sandbox Code Playgroud)

我希望有某种枚举:

 Animal_Tag [Animal_id, AnimalTypeEnumeration[ Fish | Mammal ], Tag_id].
Run Code Online (Sandbox Code Playgroud)

谢谢!

Tom*_*son 2

我怀疑你不能用映射的超类来做到这一点。

关于映射超类的问题是它没有定义持久类型。它为持久类型定义了一种模板。每次定义带注释的子类时@Entity,都会创建模板的实例,但在数据模型中,这些类型之间没有关系。使用映射的超类几乎是将给定字段集复制并粘贴到新实体类中的快捷方式。

所以,就数据模型而言,不可能有animal_id,因为不存在animal这样的类型。数据库中仅存在鱼类和哺乳动物。

您可以创建AnimalClass一个实体而不是映射的超类吗?如果您使用每个类一个表的继承策略,则不需要为其创建一个表。但它将使animal成为一种类型,这意味着ORM将能够使用animal_id。