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によって自動的に処理されるため、この値を取得する方法はありません。

ApplicationProcessパラメータとしてasを受け取るメソッドを呼び出していますが、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

数式注釈を使用できます。Hibernateを使用している場合は、次のリンクに従って以下のコードを使用できます。

private String theApType;

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

もちろん、クエリで使用することもできます。

于 2017-08-09T15:15:11.577 に答える
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 に答える