如何在运行时获取DiscriminatorValue

She*_*ari 24 java inheritance hibernate jpa single-table-inheritance

我们有以下课程

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // optional annotation as this is default
@DiscriminatorColumn(name = "apType", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("AP")
public class ApplicationProcess {
}
Run Code Online (Sandbox Code Playgroud)

还有这个

@Entity
@DiscriminatorValue("APS")
public class ApplicationProcessScheme extends ApplicationProcess {
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在运行时知道它是否ApplicationProcessDiscriminatorValue AP or APS.由于这是由jpa自动处理的,我无法获得此值.

我们正在调用一个带ApplicationProcess参数的方法,我想避免使用它instanceof来检查它是什么类型.如果我可以做类似的事情会更酷

applicationProcess.getApType().equals("AP");
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 41

您可以将鉴别器映射为只读属性:

public class ApplicationProcess { 

    ...

    @Column(name = "apType", insertable = false, updatable = false)
    private String apType;

}
Run Code Online (Sandbox Code Playgroud)


Wir*_*rus 39

我可以想象一些可能有用的情况,但是尽管你需要这个的原因,你可以在你的抽象类方法上创建

@Transient
public String getDiscriminatorValue(){
    DiscriminatorValue val = this.getClass().getAnnotation( DiscriminatorValue.class );

    return val == null ? null : val.value();
}
Run Code Online (Sandbox Code Playgroud)

  • 只要您不在延迟加载/代理对象上使用它,这就是一个很好的解决方案 - 在这种情况下,该类是代理类,并且不会包含“@DiscriminatorValue”注释。 (2认同)