是的,几乎没有办法映射这种情况。JPA支持三种不同的数据表示形式:
- 单表 策略
- 联合 策略
- 逐表 策略
换句话说,根据所使用的继承类型,您将获得不同的数据库模型。各种JPA提供程序可能支持其他继承策略。
考虑以下示例:
@Entity@Inheritance //by default SINGLE_TABLE strategy@DiscriminatorColumn( //not supported for TABLE_PER_CLASS strategy name = "BUS_TYPE", discriminatorType = DiscriminatorType.INTEGER)public abstract class Bus { @Id protected int id; protected int seats; public Bus() { }}@Entity@DiscriminatorValue(value = "1") //not supported for TABLE_PER_CLASS strategypublic class BusSubClass1 extends Bus { private String specific1; public BusSubClass1() { }}@Entity@DiscriminatorValue(value = "2") //not supported for TABLE_PER_CLASS strategypublic class BusSubClass2 extends Bus { @Temporal private Data specific2; public BusSubClass2() { }}使用
InheritanceType.SINGLE_TABLE策略将导致一个包含所有具体实体类型的数据库表:
Bus ID BUS_TYPE SEATS SPECIFIC1 SPECIFIC2 -- -------- ----- --------- --------- 1 1 50 qwerty 2 1 55 asdfgh 3 2 30 2014-01-01
- 继承层次结构中的每个具体实体实例都通过区分符值进行区分(此处由BUS_TYPE列指示)
- 所有数据库列都必须声明为 可 为 空, 因为并非所有数据库列都可能包含值(因此,对于无法设置为null的列可能会出现问题)
- 宽或深的层次结构可能会影响性能(表中分别有很多冗余的列或行)
- 缺乏规范化会浪费数据库表中的空间
- 为读取和写入操作提供良好的性能(多态查询不需要连接,仅需要鉴别符值)
- 添加/删除实体字段可能有问题(从数据库管理的角度来看)
使用
InheritanceType.JOINED策略会导致每个实体类型具有多个数据库表(来自的所有共享字段
Bus都存储在相应的表中):
Bus BusSubClass1 BusSubClass2 ID BUS_TYPE SEATS ID SPECIFIC1 ID SPECIFIC2 -- -------- ----- -- --------- -- --------- 1 1 50 1 qwerty 3 2014-01-01 2 1 55 2 asdfgh 3 2 30
- 继承层次结构中的每个具体实体类都通过鉴别符值进行区分(此处由BUS_TYPE列指示)
- 标准化可改善数据存储(与SINGLE_TABLE策略相比,减少了未使用的空间)
- 非多态查询(针对单个具体实体)需要联接
- 多态查询(用于实体类的广泛或深入层次结构)需要多个联接,并且可能很昂贵
- 添加/删除实体字段非常简单(从数据库管理的角度来看)
使用
InheritanceType.TABLE_PER_CLASS策略可以为每种实体类型精确地提供一个数据库表(所有共享字段
Bus都在具体的子类中重新定义):
BusSubClass1 BusSubClass2 ID SEATS SPECIFIC1 ID SEATS SPECIFIC2 -- ----- --------- -- ----- --------- 1 50 qwerty 3 30 2014-01-01 2 55 asdfgh
- 继承层次结构中的每个具体实体类仅通过共享标识符来区分(不使用鉴别符)
- 规范化改善了数据存储(与SINGLE_TABLE策略相比,未使用的空间更少,但比JOINED策略的情况要多)
- 非多态查询(对于单个具体实体)非常有效,因为不需要连接
- 多态查询(用于实体类的广泛或深入层次结构)需要多个联接,并且可能很昂贵
- 添加/删除实体字段非常简单(从数据库管理的角度来看)



