JPA:为什么每个具体类实现表可选?

时间:2015-07-18 13:02:37

标签: java hibernate jpa orm

对于一个项目我目前正在将Hibenate的ORM统计数据与自己的基本ORM实现进行比较。在查看我发现的JPA specifications时,Single TableJoined subclass需要实施,而不是per concrete class。我试图找出是否有任何明显的不满,但我找不到任何答案,为什么joined需要得到支持,而不是concrete。有没有人对此有答案?

由于

2 个答案:

答案 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运算符会重复检测,这会降低应用程序的速度。