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