Inheritance 将JPA实体映射到继承层次结构

Inheritance 将JPA实体映射到继承层次结构,inheritance,jpa,mapping,hierarchy,Inheritance,Jpa,Mapping,Hierarchy,假设我有一个类似于以下内容的对象模型: abstract class Vehicle { String guid; String name; Double price; } class SUV extends Vehicle { Integer towingCapacity; } class Hybrid extends Vehicle { Integer batterySize; } 我需要使用JPA并将这个层次结构映射到数据库中。我选择了“每类联接表”方法,如

假设我有一个类似于以下内容的对象模型:

abstract class Vehicle {
   String guid;
   String name;
   Double price;
}
class SUV extends Vehicle {
   Integer towingCapacity;
}
class Hybrid extends Vehicle {
   Integer batterySize;
}
我需要使用JPA并将这个层次结构映射到数据库中。我选择了“每类联接表”方法,如下所述:

因此本质上我有一个
车辆
父表,一个
SUV
混合动力
表有一个
车辆
的外键。我选择此解决方案的原因是,我喜欢规范化的模式,此外,
Vehicle.guid
需要全局唯一,因此有一个带有该字段的父表(而不是分散在各个表中)可以简化此唯一约束

我对JPA还比较陌生,我不知道如何将它们设置为JPA实体。class
Vehicle
是否为MappedSuperclass?此外,我知道我需要向每个实体添加@Id,但是
SUV
Hybrid
会使用
Vehicle
表的外键还是必须使用子表中的主键作为标识符


提前感谢。

为整个层次结构定义了一次id并将其继承,因此
车辆
类中的
@id
属性就足够了

@MappedSuperclass
表示该类未映射到单独的表,而是其子表的一部分。如果您想要一个规范化的模式,那么将
Vehicle
也作为一个实体

不需要为子实体定义外键。这是由持久性提供者完成的,对开发人员来说是透明的


请注意,
JOINED
继承策略的性能低于默认的
SINGLE_表
策略<代码>单表需要更多空间,并且不支持派生实体的非空列。

因此根据您的建议,我有
车辆
SUV
混合
所有实体<代码>车辆有@Id,
SUV
混合动力车
没有@Id,只有必要的@Column。当我尝试使用该设置持久化SUV时,我得到一个错误,指出未找到表Vehicle,并且正下方有一个尝试为表Vehicle准备一个语句,其中包含Vehicle和SUV表中的每一列。PU似乎没有意识到层次结构。有什么想法吗?很抱歉,我在
SUV
实体上缺少
@PrimaryKeyJoinColumn(name=“VehicleId”,referenceColumnName=“VehicleId”)
,在
Vehicle
实体上缺少
@heritance(strategy=heritancetype.JOINED)
。这解决了上面准备好的stmt问题,但仍然找不到get table。奇怪的是,如果我将持久化单元中的表生成策略更改为create,那么一切都正常。但是我找不到创建表的位置。一定是持久性单元的问题,我没有看到。但至少这种坚持是有效的:)谢谢。