表每子类Vs表每个具体类在hibernate中?

时间:2011-11-17 04:44:05

标签: sql hibernate

在大多数Web应用程序中,我看到一个基类包含公共属性和扩展基类的子类数。所以我的问题是我们应该采用哪种策略 Table Per Subclass Vs Table Per concrete具体类。我个人认为我们应该为每个子类寻找表,因为将来如果我们想要引入公共列,我们可以在一个地方进行,但是在具体类的情况下,我们必须在多个表中进行。 从右吗

但是如果我们想要从所有子表中获取所有deatils,我认为每个具体类的表将会有所帮助因为我们必须简单地将所有表中的记录联合起来但是在的情况下每个子类的表以及union我们必须引入与父表的连接,这将更加昂贵。对吗?

2 个答案:

答案 0 :(得分:23)

您可能对JPA 2.0 specification的第2.12节“继承映射策略”感兴趣,因为它总结了所有可能的继承类型及其优缺点。让我拿出最有趣的片段:

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

  

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

2.12.3每个具体课程策略表

  

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

2.12.2加入子类策略

  

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

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


  

我个人认为我们应该为每个子类使用表,因为在   未来,如果我们想引入共同专栏,我们可以在一个专栏上做   但是在具体类的情况下,我们必须多次进行   表。

是的,但是JOINED策略还为您提供了相同的功能,并允许在一个表中指定公共属性。

希望有所帮助!

答案 1 :(得分:13)

<强> The Object-Relational Impedance Mismatch

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

enter image description here

enter image description here

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

  • 每类表格,即层次结构只有一个表格
  • Table Per Concrete类,即每个具体类的一个表,不适用于超类
  • 每个子类的表格,即每个类别前面的一个表格

enter image description here

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

enter image description here

在此策略中,表按类创建,但由外键关联。所以没有重复的列。

enter image description here

在此策略中,表按类创建,但由外键关联。所以没有重复的列。

enter image description here

image source