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实体。classVehicle
是否为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,那么一切都正常。但是我找不到创建表的位置。一定是持久性单元的问题,我没有看到。但至少这种坚持是有效的:)谢谢。