2011-08-17 16 views
0

私はいくつかのユーザー定義レコードを格納できる汎用データベース構造を持っています。たとえば、メインテーブルは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を使用しています)?

答えて

0

複数の属性を同じ列にマップできます。 追加属性には@Column(name = "column name", insertable = false, updatable = false, nullable = false)という注釈が付けられます。

また、あなたはp.firstNamep.string01に内部でマップするために/置き換えJPQLリゾルバを向上させることができるかもしれないが、それはEclipseLinkのは、特定のだろう、とそれも可能だ場合、私は本当に知りません。探してみるだけのヒントとしてこれを取ってください。

+0

'insertable = false、updatable = false'を使用すると私にとって効果的です。マーフィーの法則ですが、私はこれらのパラメータとその目的を知っていますが、私はこの文脈でそれらを使用することを考えていませんでした。ありがとう。 –

関連する問題