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

时间:2014-04-10 14:11:06

标签: 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并将此层次结构映射到数据库中。我已选择加入每班加入的表格#39;方法,如下所述:http://java.dzone.com/articles/jpa-implementation-patterns-mapping

基本上我有一个Vehicle父表,SUVHybrid表具有Vehicle的外键。我选择这个解决方案的原因是我喜欢规范化的模式,另外Vehicle.guid需要全局唯一,因此拥有包含该字段的父表 - 而不是分散在各个表中 - 简化了这个UNIQUE约束。

我对JPA仍然相对较新,我不知道如何将它们设置为JPA实体。类Vehicle是MappedSuperclass吗?另外,我知道我需要向每个实体添加@Id,但是SUVHybrid会使用Vehicle表的外键,还是我必须使用主键从子表中作为标识符?

提前致谢。

1 个答案:

答案 0 :(得分:1)

id为整个层次结构定义一次并且是继承的,因此@Id类中的Vehicle属性就足够了。

@MappedSuperclass表示该类未映射到单独的表,而是它的子表的一部分。如果您需要规范化架构,也可以将Vehicle设为实体。

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

请注意,JOINED继承策略的性能低于默认的SINGLE_TABLE策略。 SINGLE_TABLE需要更多空间,并不真正支持派生实体的非可空列。