【问题标题】:Hibernate discriminator column with table per subclassHibernate 鉴别器列,每个子类都有表
【发布时间】:2011-09-06 08:46:09
【问题描述】:

现在我正在使用每个子类的表方法来对我的数据进行建模。我的层次结构的简化是:

abstract class Abstract {
    /* common data stored in abstract */
}

class ConcreteTypeA1 extends Abstract {
    /* extra data stored in concrete_type_a_1 */
}

class ConcreteTypeA2 extends Abstract {
    /* extra data stored in concrete_type_a_2 */
}

class ConcreteTypeB extends Abstract {
    /* extra data stored in concrete_type_b */
}

所以它做了三个外部连接,我在其中抓取 Abstract 类型的实例(实际上是十二个)。我昨天意识到 ConcreteTypeA1 和 ConcreteTypeA2 确实有相同的额外数据,它们只是表现不同,所以我想做的是通过将这两个类填充到一个表中并使用鉴别列来减少连接的数量。我如何/我可以做到这一点?

class Abstract {
    /* common data stored in abstract */
}

abstract class ConcreteTypeA extends Abstract {
    /* extra data stored in abstract_type_a */
}

class ConcreteTypeA1 extends ConcreteTypeA {
    /* just behavior, no extra data, uses data in abstract_type_a */
}

class ConcreteTypeA2 extends ConcreteTypeA {
    /* just behavior, no extra data, uses data in abstract_type_a */
}

class ConcreteTypeB extends Abstract {
    /* extra data stored in concrete_type_b */
}

【问题讨论】:

标签: java hibernate


【解决方案1】:

在父类上使用它

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name="type",
    discriminatorType=DiscriminatorType.STRING)

在具体的类上使用

@DiscriminatorValue("TypeA")

【讨论】:

  • 这个答案缺少我在 Vincents 链接中找到的在 ConcreteTypeA 中使用 @SecondaryTable(table = "abstract_type_a") 和 @Column(table = "abstract_type_a") 的重要补充。
  • @RansomBriggs 这显示了“每个类层次结构的表”方法;另一种是使用带有鉴别器列和辅助表的混合方法。
【解决方案2】:

根据文森特的建议使用了这个问题的答案。

How to mix inheritance strategies with JPA annotations and Hibernate?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多