【问题标题】:Multiple discriminator columns in Hibernate inheritance hierarchyHibernate 继承层次结构中的多个鉴别器列
【发布时间】:2012-03-27 13:01:54
【问题描述】:

我有这样的结构:

abstract class A
abstract class B extends A
abstract class C extends B

这是我的实际映射:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "TAB_A")
@DiscriminatorColumn(name = "DISCRIMINATOR_A",
                     discriminatorType = DiscriminatorType.STRING)
public abstract class A {
}

@Entity
@DiscriminatorValue("VALUE")
@SecondaryTable(name = "TAB_B",
                pkJoinColumns = @PrimaryKeyJoinColumn(name="ID_A"))
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR_B",
                     discriminatorType = DiscriminatorType.STRING)
public abstract class B extends A
{
}

@Entity
@DiscriminatorValue("VALUEB")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class C extends B
{
}

我在 A 和 B 之间有一个鉴别器列 discriminatorA
我在 B 和 C 之间有一个鉴别器列 discriminatorB

A 和 B 之间的继承有效。 B 和 C 之间的继承不起作用。我读到了这一点:

11.1.10 DiscriminatorColumn 注解

对于 SINGLE_TABLE 映射策略,通常也适用于 JOINED 策略,持久性提供程序将使用类型鉴别器列。 DiscriminatorColumn 注解用于定义 SINGLE_TABLE 和 JOINED 继承映射策略的鉴别器列。

策略和鉴别器列仅在应用了不同继承策略的实体类层次结构或子层次结构的根中指定。

有人知道如何制作这个映射吗?

【问题讨论】:

  • 所以 JPA 允许每个继承树有 1 个鉴别器。
  • ...“或应用不同继承策略的子层次结构”。您在子层次结构中使用了相同的继承策略。

标签: java hibernate jpa inheritance


【解决方案1】:

删除这个:

@DiscriminatorColumn(name="DISCRIMINATOR_B",discriminatorType=DiscriminatorType.STRING)

每个层次结构有一次鉴别器列就足够了。此层次结构中的所有实体都将在 TAB_A 中具有行(在实体 A 中定义)。如果您使用联合继承策略(多个表),这也足够了。

您的映射的其他问题:

  • A 是实体层次结构的根,不需要在 B 和 C 中使用 @Inheritance
  • @DiscriminatorValue 应该放在具体的实体上,B 和 C 是抽象的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2014-12-22
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多