对于一个项目我目前正在将Hibenate
的ORM统计数据与自己的基本ORM实现进行比较。在查看我发现的JPA specifications时,Single Table
和Joined subclass
需要实施,而不是per concrete class
。我试图找出是否有任何明显的不满,但我找不到任何答案,为什么joined
需要得到支持,而不是concrete
。有没有人对此有答案?
由于
答案 0 :(得分:1)
想象一下以下简单模型:
@Entity
@Inheritance(strategy = InheritanceType....)
public class Superclass {
@Id
private Long id;
private String superValue;
}
@Entity
public class Subclass extends Superclass {
private String subValue;
}
现在让我们看看一些问题:
SELECT s FROM Superclass s
此查询已转换为InheritanceType.SINGLE_TABLE
的SQL:
SELECT id, dtype, superValue, subValue FROM Superclass
(dtype
是鉴别器列,用于指示实体的类)
此查询已转换为InheritanceType.JOINED
的SQL:
SELECT Superclass.id, dtype, superValue, subValue FROM Superclass
LEFT JOIN Subclass ON Superclass.id = Subclass.id
最后是InheritanceType.TABLE_PER_CLASS
:
SELECT id, 'Superclass' AS dtype, superValue, null FROM Superclass
UNION ALL SELECT id, 'Subclass' AS dtype, superValue, subValue FROM Subclass
正如您所看到的,InheritanceType.TABLE_PER_CLASS
的主要缺点是:表格未规范化,您必须使用慢UNION
。因为这是一个特殊的'表格布局,与JOINED
相比没有优势,由提供商提供支持。
答案 1 :(得分:1)
根据JPA规范,每个具体类策略的表是可选的,因为有以下缺点:
这种策略有以下缺点: •它对多态关系提供的支持很少。 •通常要求为旨在覆盖类层次结构的查询发出SQL UNION查询(或每个子类的单独SQL查询)。
一个特殊的缺点是多态查询所需的UNION运算符会重复检测,这会降低应用程序的速度。