我有一个经典的Hibernate @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代码中使用
@DiscriminatorValue
定义了大约30个Animal的子类。当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() { ... }
}