Sql hibernate中每个子类的表与每个具体类的表?

Sql hibernate中每个子类的表与每个具体类的表?,sql,hibernate,Sql,Hibernate,在大多数web应用程序中,我看到一个基类由公共属性和扩展基类的子类组成。所以我这里的问题是,我们应该在每个子类的表与每个具体类的表之间选择哪个策略。我个人认为我们应该选择每个子类一个表,因为将来如果我们想引入公共列,我们可以在一个地方进行,但是在具体类的情况下,我们必须在多个表中进行对吗? 但是如果我们想从所有子表中获取所有数据,我认为每个具体类的表会很有帮助,因为我们必须简单地合并所有表中的记录,但是如果每个子类的表与union一起,我们必须引入与父表的join,这将更加昂贵.对吗?您可能会对

在大多数web应用程序中,我看到一个基类由公共属性和扩展基类的子类组成。所以我这里的问题是,我们应该在每个子类的表与每个具体类的表之间选择哪个策略。我个人认为我们应该选择每个子类一个表,因为将来如果我们想引入公共列,我们可以在一个地方进行,但是在具体类的情况下,我们必须在多个表中进行对吗?


但是如果我们想从所有子表中获取所有数据,我认为每个具体类的会很有帮助,因为我们必须简单地合并所有表中的记录,但是如果每个子类的与union一起,我们必须引入与父表的join,这将更加昂贵.对吗?您可能会对的第2.12节“继承映射策略”感兴趣,因为它总结了所有继承类型及其优缺点。让我拿出最有趣的片段:

2.12.1每类一个表的层次结构策略

此映射策略为多态性提供了良好的支持 实体之间的关系以及在整个范围内的查询的关系 类层次结构。然而,它有一个缺点,那就是它需要 与特定于子类的状态对应的列可以是 可为空

2.12.3每个具体班级策略的表格

这种策略有以下缺点:
-它为多态关系提供了差的支持。
-它通常要求为要覆盖类层次结构的查询发出SQL UNION查询(或每个子类单独的SQL查询)

2.12.2加入子类策略

它的缺点是需要一个或多个连接操作 可以执行以实例化子类的实例。深造 层次结构,这可能导致不可接受的性能。质疑 类层次结构上的范围同样需要联接

此外,如果您计划与JPA兼容,请记住JPA提供商不必支持
每类表
策略类型


我个人觉得我们应该按子类选择table,因为在 将来,如果我们想介绍公共专栏,我们可以一次介绍 但在混凝土类的情况下,我们必须多次进行 桌子

正确,但联接策略也提供了相同的功能,并允许在一个表中指定公共属性

希望有帮助

在对象模型中,在创建对象时,我们可能需要使用继承,即概括,如下所示:


在关系模型中,上述泛化(非关联,即一对一或多对多)可以通过以下三种继承映射策略在Hibernate ORM中实现:

  • 每个类的表,即对于层次结构,只有一个表
  • 每种混凝土等级的表,即每种混凝土等级一个表,而不是超级等级
  • 每个子类的表,即每个类一个表

在这个策略中,我们可以将整个层次结构映射到单个表中,在这里我们使用一个更多的鉴别器列,即TYPE


在这种策略中,表是按照类创建的,但通过外键关联。因此没有重复的列


在这种策略中,表是按照类创建的,但通过外键关联。因此没有重复的列



嗨,Piotr,谢谢你的回复。你能解释一下单表每类层次结构策略是如何为多态但连接的子类策略提供很好的支持的吗。@MohitGupta我就是这么看的:假设你有一个
动物->[Dog,Cat]
层次结构。在
singleTable
中,所有类型都在一个表中-当有人执行
SELECT Animal a…
时,无需执行联接。如果您有
joinedStrategy
,那么您需要在表上进行连接(因为每个子类都在不同的表中),但在一个表中仍然有一个公共属性(Animal)。然而,在
concreteTable
策略中,每个类都在单独的表中,因此选择所有动物需要单独访问所有表。希望有帮助@Piotr.同意澄清,但这与多态性有何关系。。我对多态性这个词有点怀疑。好吧,你要求的是
Animal
实例,你不关心它的哪个子类会被返回。您甚至可以使用
Animal
的一些公共属性对其进行过滤-同样,您不关心将返回哪些子类。这就是所谓的
多态查询
。此外,对于不仅仅是jpa的情况,每个层次结构的表策略允许您使用实体的可变子类。那么Joined呢?