私はいくつかのユーザー定義レコードを格納できる汎用データベース構造を持っています。たとえば、メインテーブルはRECORDで、列はSTRING01、STRING02、[...]、NUM01、NUM02などです。JPAで継承クラスの属性を再定義する方法
これはちょっと変わっていることはわかっていますが、利点も短所もあります。ただし、この構造は存在し、変更することはできません。今はいくつかのJPAクラスを作成したいと思います。そして、
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Record {
@Id
private long id;
@Column(name="STRING01")
private String string01;
@Column(name="STRING02")
private String string02;
@Column(name="NUM01")
private BigDecimal num01;
}
Iレコードから継承された特定のクラスの作成:次のように
まず、Iは、(注釈がgettersthe例に配置されているだけで簡略化され)抽象クラスレコードを作成
@Entity
@DiscriminatorValue("Person")
public class Person extends Record {
@Transient
public String getFirstName() {
return getString01();
}
public void setFirstName(String name) {
setString01(name);
}
@Transient
public BigDecimal getWeight() {
return getNum01();
}
public void setWeight(BigDecimal weight) {
setNum01(weight);
}
}
を
私はPERSONの主キー(EntityManager.find()
を介して)をRECORDに問い合わせ、PERSONのインスタンスとしてResultを取得できるので、これはうまくいきます。ジェネリックカラム名を知らなくてもFirstNameとWeightを問い合わせることができます。
しかし、SELECT p FROM Person p WHERE p.firstName = 'Michael'
のような独自のJPAクエリを作成すると失敗します。 firstName
は一時的です。ここでは一般名string01
を使用しなければなりません。
JPAで基本クラスの属性名をオーバーライドする方法はありますか?たぶんベンダー固有のソリューションがあります(私はEclipseLinkを使用しています)?
'insertable = false、updatable = false'を使用すると私にとって効果的です。マーフィーの法則ですが、私はこれらのパラメータとその目的を知っていますが、私はこの文脈でそれらを使用することを考えていませんでした。ありがとう。 –