假设我有一个类似于以下内容的对象模型:
abstract class Vehicle {
String guid;
String name;
Double price;
}
class SUV extends Vehicle {
Integer towingCapacity;
}
class Hybrid extends Vehicle {
Integer batterySize;
}
我需要使用JPA并将此层次结构映射到数据库中。我已选择加入每班加入的表格#39;方法,如下所述:http://java.dzone.com/articles/jpa-implementation-patterns-mapping
基本上我有一个Vehicle
父表,SUV
和Hybrid
表具有Vehicle
的外键。我选择这个解决方案的原因是我喜欢规范化的模式,另外Vehicle.guid
需要全局唯一,因此拥有包含该字段的父表 - 而不是分散在各个表中 - 简化了这个UNIQUE约束。
我对JPA仍然相对较新,我不知道如何将它们设置为JPA实体。类Vehicle
是MappedSuperclass吗?另外,我知道我需要向每个实体添加@Id,但是SUV
和Hybrid
会使用Vehicle
表的外键,还是我必须使用主键从子表中作为标识符?
提前致谢。
答案 0 :(得分:1)
id为整个层次结构定义一次并且是继承的,因此@Id
类中的Vehicle
属性就足够了。
@MappedSuperclass
表示该类未映射到单独的表,而是它的子表的一部分。如果您需要规范化架构,也可以将Vehicle
设为实体。
您无需为子实体定义外键。这是由持久性提供程序完成的,对开发人员来说是透明的。
请注意,JOINED
继承策略的性能低于默认的SINGLE_TABLE
策略。 SINGLE_TABLE
需要更多空间,并不真正支持派生实体的非可空列。