【问题标题】:Hibernate - Which inheritance strategy should I use for a class which isn't abstract, but sub-classes may not need tablesHibernate - 我应该对非抽象类使用哪种继承策略,但子类可能不需要表
【发布时间】:2011-03-31 19:41:18
【问题描述】:

我的项目中有一个简单的继承关系,我希望超类是抽象的。一些继承类将需要额外的数据库信息,而另一些则不需要。我不确定要使用哪种继承策略。

我似乎无法找到一个直接的答案,即超类可以拥有一个带有 JOINED 策略的抽象类。

我怀疑子类的数量不会变得太大,而且它们都不应该有很多额外的数据,所以也许一个 SINGLE_TABLE 就足够了。

我真的不想无缘无故多表,所以TABLE_PER_CLASS是不合适的。

如果有任何指导,我将不胜感激。

谢谢

【问题讨论】:

    标签: java hibernate inheritance jpa hibernate-annotations


    【解决方案1】:

    如果子类不需要表,我几乎总是只使用单表方法进行继承。如果由于某种原因,确实需要一个表的子类之一有一些荒谬的额外字段(比如 10+),那么额外的数据可能表明您需要为某些子类创建单独的表并为其他子类创建平面表。

    这将如何在 hibernate 中具体映射,我不确定,但我认为这是一种明智的建模方式。

    【讨论】:

    • 谢谢!这就是我的想法,但我仍然不确定加入策略是否会更好。
    • @Stefan 很高兴看到您的意见。在工作中的项目中使用了继承。有一个Master 实体和大约 17 个子类实体,因为虽然大多数数据字段相似,但每个子类可能有一个或两个(有时更多)唯一字段。起初这似乎是正确的,直到我遇到诸如允许用户更改子类类型或在查询中看到 17 个联接(因为有 17 个表)等问题。所以你认为在适当的地方有一个空值的表会更好吗?我仍然是 ORM 新手,但我一直在想。
    【解决方案2】:

    回答这个问题为时已晚,但如果其他人有类似情况,可能会有所帮助。

    使用 SingleTable 策略,如果您认为其中一个子类具有更多字段并且需要单独的表,则使用 @SecondaryTable 注释将该子类标记为 SecondaryTable 并使用 PrimaryKeyJoin(对此有注释)加入在 pk 列上具有超类。此外,子类中的所有字段都应使用@column 注释中的'table' 属性显式映射到secondaryTable。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多