一尘不染

映射Hibernate实体以获得InheritanceType.SINGLE_TABLE的未知DiscriminatorValue

hibernate

我有一个经典的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代码中使用定义了大约30个Animal的子类@DiscriminatorValue。当Hibernate发现鉴别器的未知值时,它将抛出WrongClassException。但是,我需要将这些未知的标识符值映射到一个实体,最好是Animal类。(在这种情况下,我只需要使用方法getName()即可。)

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

PS这是一个遗留代码,因此我无法更改模型。


阅读 280

收藏
2020-06-20

共1个答案

一尘不染

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() { ... }
}
2020-06-20