我有一个经典的休眠@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
和@DiscriminatorFormula
。它工作正常。但是,数据库中的@DiscriminatorValue
大约有 500 个不同的值,我需要将其中大约 30 个映射到 Java 类(子类),其余的映射到父 Java 类。
可以将该问题建模为 Animal 类上的示例继承。
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("...")
public class Animal implements Serializable {
...
@Column
public String getName() { ... }
}
所以我在 Java 代码中定义了大约 30 个带有 @DiscriminatorValue
的动物子类。当Hibernate发现鉴别器的未知值时,它会抛出WrongClassException
。但是,我需要将这些未知的鉴别器值映射到一个实体,最好的是 Animal 类。 (在这种情况下,我只需要使用 getName() 方法。
我知道一种解决方案是将 SQL CASE 放入@DiscriminatorFormula
但随后我必须在那里声明所有 30 个已知的鉴别器值(当我需要添加其他值时还会有更多)。所以我正在寻找更灵活的解决方案。
附言这是一个遗留代码,所以我无法更改模型。
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() { ... }
}
好消息。我刚刚在新的用户指南中记录了这种行为。这是JIRA问题。
基本上,您有两种选择:
- 当没有与基础数据库列值匹配的显式鉴别器值映射时,
@DiscriminatorValue("not null")
作为回退策略。 -
@DiscriminatorValue("null")
数据库列值为 null 的情况。通常,您会将其用于基类。
Hibernate博客上也有一个详细的例子。