9

我有一个经典的休眠@Inheritance(strategy=InheritanceType.SINGLE_TABLE)模式@DiscriminatorFormula。它工作正常。但是,数据库中有大约 500 个不同的值,@DiscriminatorValue我需要将其中大约 30 个映射到 Java 类(子类),其余映射到父 Java 类。

该问题可以建模为 Animal 类的示例继承。

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("...")
public class Animal implements Serializable {
  ...
  @Column
  public String getName() { ... }
}

所以我在 Java 代码中定义了大约 30 个 Animal 的子类@DiscriminatorValue。当 Hibernate 发现鉴别器的未知值时,它会抛出WrongClassException. 但是,我需要将这些未知的鉴别器值映射到一个实体,最好是 Animal 类。(在这种情况下,我只需要使用 getName() 方法。)

我知道一种解决方案是将 SQL CASE 放入其中,@DiscriminatorFormula但随后我必须在其中说明所有 30 个已知的鉴别器值(当我需要添加其他值时再加上更多)。所以我正在寻找更灵活的解决方案。

PS这是一个遗留代码,所以我不能改变模型。

4

2 回答 2

8

tscho为我指明了正确的方向,因此我能够为我的案例找到解决方案。评估@DiscriminatorValue特殊值@DiscriminatorValue("null")@DiscriminatorValue("not null")。第二个适合我。

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("...")
@DiscriminatorValue("not null")
public class Animal implements Serializable {
  ...
  @Column
  public String getName() { ... }
}
于 2012-07-02T10:32:20.300 回答
4

好消息。我刚刚在新的用户指南中记录了这种行为。这是JIRA问题。

基本上,您有两种选择:

  • @DiscriminatorValue("not null")当没有与底层数据库列值匹配的显式鉴别器值映射时,作为备用策略。
  • @DiscriminatorValue("null")当数据库列值为空时。通常,您会将其用于基类。

Hibernate 博客上也有一个详细的示例。

于 2016-07-18T15:01:32.050 回答