Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:为什么每个具体类实现表是可选的?_Java_Hibernate_Jpa_Orm - Fatal编程技术网

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

Java JPA:为什么每个具体类实现表是可选的?,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,对于一个项目,我目前正在将Hibenate中的ORM策略与自己的基本ORM实现进行比较。在查看时,我发现,单个表和连接的子类需要实现,但不是每个具体类。我试图找出是否有任何明显的缺陷,但我找不到任何答案来解释为什么需要支持joined,而不是concrete。有人对此有答案吗 谢谢想象一下以下简单的模型: @Entity @Inheritance(strategy = InheritanceType....) public class Superclass { @Id priva

对于一个项目,我目前正在将
Hibenate
中的ORM策略与自己的基本ORM实现进行比较。在查看时,我发现,
单个表
连接的子类
需要实现,但不是每个具体类。我试图找出是否有任何明显的缺陷,但我找不到任何答案来解释为什么需要支持
joined
,而不是
concrete
。有人对此有答案吗


谢谢

想象一下以下简单的模型:

@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
此查询已转换为继承类型的SQL。单个表:

SELECT id, dtype, superValue, subValue FROM Superclass
dtype
是表示实体类别的鉴别器列)

此查询已转换为SQL for
InheritanceType.JOINED

SELECT Superclass.id, dtype, superValue, subValue FROM Superclass 
  LEFT JOIN Subclass ON Superclass.id = Subclass.id
最后,对于
InheritanceType.TABLE\u PER\u CLASS

SELECT id, 'Superclass' AS dtype, superValue, null FROM Superclass 
UNION ALL SELECT id, 'Subclass' AS dtype, superValue, subValue FROM Subclass

正如您所看到的,
InheritanceType.TABLE\u PER\u CLASS
的主要缺点是:这些表没有规范化,您必须使用缓慢的
联合。由于这是一种“特殊”表格布局,并且与加入的
相比没有任何优势,因此由提供商来支持它。

根据JPA规范,每个具体类别的表格策略是可选的,因为存在以下缺点:

这种策略有以下缺点: •它对多态关系的支持较差。 •它通常要求针对要跨越类层次结构的查询发出SQL联合查询(或每个子类单独的SQL查询)


一个特别的缺点是,多态查询所需的UNION运算符会执行重复检测,这会降低应用程序的速度。

在我发布的链接的第58页上说:
支持表/具体类继承映射策略在本版本中是可选的。使用此映射策略的应用程序将无法移植。
是的,我意识到我没有正确阅读您的问题。很抱歉,规范化是我还没有考虑过的一个方面。你有没有一个例子来说明这是一个怎样的问题?单个表中的数据也没有标准化…但是
单个表
对性能没有影响(在许多情况下,它甚至比
连接的
更快),并且更易于实现。