将Hibernate实体映射为未知的DiscriminatorValue for InheritanceType.SINGLE_TABLE
我有一个经典的Hibernate @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
和@DiscriminatorFormula
。 它工作正常。 但是,数据库中的@DiscriminatorValue
大约有500个不同的值,我需要将其中大约30个映射到Java类(子级),其余的映射到父级Java类。
可以将该问题建模为Animal类的示例inheritance。
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorFormula("...") public class Animal implements Serializable { ... @Column public String getName() { ... } }
所以我在Java代码中使用@DiscriminatorValue
定义了大约30个Animal的子类。 当Hibernate为鉴别器找到未知值时,它会抛出WrongClassException
。 但是,我需要将这些未知的鉴别器值映射到一个实体,最好是Animal类。 (在这种情况下我只需要使用方法getName()。)
我知道一个解决方案是将一个SQL CASE放入@DiscriminatorFormula
但是我必须在那里声明所有30个已知的鉴别器值(当我需要添加其他值时加上更多)。 所以我正在寻找更灵活的解决方案。
PS这是遗留代码,因此我无法更改模型。
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博客上也有一个详细的例子。