26

我们有以下课程

@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 {
}

和这个

@Entity
@DiscriminatorValue("APS")
public class ApplicationProcessScheme extends ApplicationProcess {
}

ApplicationProcess现在我需要在运行时知道DiscriminatorValue AP or APS. 由于这是由 jpa 自动处理的,因此我无法获取此值。

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

applicationProcess.getApType().equals("AP");
4

6 回答 6

48

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

public class ApplicationProcess { 

    ...

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

}
于 2010-06-09T12:15:21.467 回答
42

我可以想象在少数情况下它可能会有所帮助,但是尽管您需要这样做,但您可以在抽象类方法上创建,例如

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

    return val == null ? null : val.value();
}
于 2012-11-26T08:42:35.430 回答
4

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

我不认为它会更酷,这似乎比打电话instanceOf给我更糟糕:如果您出于某种原因更改了鉴别器的值,它会破坏您的代码。

如果需要检查类型,请使用instanceOf. 使用鉴别器的技巧不会让事情变得更好,它只会让你的代码不那么健壮。

于 2010-06-09T11:42:53.387 回答
1

我刚遇到这个问题,不得不发布一个答案。IMO 这是使用 Java 反射 API 的明确案例

DiscriminatorValue annotation = ApplicationProcess.class.getAnnotation(DiscriminatorValue.class);
annotation.getValue().equals("AP");
于 2019-02-26T14:51:56.780 回答
0

我使用以下解决方案在运行时获取此值,假设您事先不知道什么是继承类型:

SessionFactoryImpl sessionFactory = entityManager.getEntityManagerFactory().unwrap(SessionFactoryImpl.class);
EntityPersister entityPersister = sessionFactory.getEntityPersister( Task.class.getPackage().getName()+"."+param.getValue().get(0) );
int clazz_ = 0;
if(UnionSubclassEntityPersister.class.isInstance(entityPersister)) {
    clazz_ = (Integer) ((UnionSubclassEntityPersister) entityPersister).getDiscriminatorValue();
} else if(JoinedSubclassEntityPersister.class.isInstance(entityPersister)) {
    clazz_ = (Integer) ((JoinedSubclassEntityPersister) entityPersister).getDiscriminatorValue();
}

您应该clazz_根据discriminatorType注释更改类型(整数是联合和连接策略的默认值)。SINGLE_TABLE如果添加这种情况,也可以使用此解决方案;或者您可以使用此处提到的其他解决方案。

于 2018-07-11T11:09:24.573 回答
0

您可以使用公式注释。如果您使用的是 Hibernate,则可以根据此链接使用以下代码:

private String theApType;

@Formula("apType")
String getTheApType() {
    return theApType;
}

当然,您可以在查询中使用它。

于 2017-08-09T15:15:11.577 回答