2016-05-12 18 views
0
ここ

は私が持っている問題であり、それぞれ「円」:usd_euro、usd_gbp & usd_yen。それらはすべて同じ3列(id、spotprice、timestamp)を持ちます。JPAは:動的変数インスタンスに基づいてテーブルへのエンティティのマッピング

何らかの理由で私は単一のテーブルを持つことができません。私は挿入したい

  1. と「ペア」の値に応じて、「usd_yen」「usd_euro」、「usd_gbp」&:一時的なインスタンス変数「ペアは」が何を表すかに応じて、以下の値を持つことになります例えば、もし私が 'pair'に "usd_yen"という値を持っていれば、そのオブジェクトはusd_yenテーブルに永続化されるべきです。

  2. そして、私はデータを取得したいとき、私はJPAは「ペア」の値に基づいて、中から選択するテーブルを決定したい

これは、JDBCで簡単ですが、実行する方法がありますこれはJPAでですか?

ありがとうございます。

+0

私は[this](http://stackoverflow.com/questions/3505866/how-to-map-one-class-to-different-tables-using-hibernate-jpa-annotations)にぶつかりました。 [this](http://stackoverflow.com/questions/997203/jpa-how-to-use-the-same-class-entity-to-map-different-tables)。複数のエンティティクラスを持つ以外に選択肢がないように見えます。 – kskblr07

答えて

1

私が正しくあなたの要件を理解していれば、それが許容できるかどうあなたは、エンティティ追加の結合表に継承を使用することができれば、これは実際には、(あなたが引用それらのスレッドはかなり古いです)今、JPAで実現可能であるかもしれません各タイプのIDが連続していないことを確認します。

あなたは基本的に、このようなあなたのクラスを定義することができます。

@Entity 
@Table(name="curr_base") // choose a suitable name 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="currency", discriminatorType=DiscriminatorType.STRING) // your join table needs this column in addition to the id 
public abstract class CurrencyPrice { 
    @Id 
    private int id; 
} 

@Entity 
@Table(name="usd_euro") 
@DiscriminatorValue("usd_euro") 
public class UsdEuroPrice extends CurrencyPrice { 
    float spotPrice; 
    Date timeStamp; 
} 

@Entity 
@Table(name="usd_gbp") 
@DiscriminatorValue("usd_euro") 
public class UsdGbpPrice extends CurrencyPrice { 
    float spotPrice; 
    Date timeStamp; 
} 

@Entity 
@Table(name="usd_yen") 
@DiscriminatorValue("usd_euro") 
public class UsdYenPrice extends CurrencyPrice { 
    float spotPrice; 
    Date timeStamp; 
} 

を既存のテーブル定義を変更する必要がないように、私は、各サブクラスにspotPricetimeStampを複製し - もちろんそれははるかにきれいになりますそれらをスーパークラス/結合表に置くだけです。

このマッピングでは、たとえばEntityManager.persist(new UsdGbpPrice(...))を実行し、JPAに正しい表に行を挿入させることができます。詳細はhereをご覧ください。

+0

こんにちはHeinBlöd、詳細な対応をありがとうございます。あなたの答えの最後の部分に来て、UsdGbpPriceの代わりにGenericEntityManager.persist(CurrencyPrice)を持つことは可能ですか?エンティティタイプ(通貨ペア)固有のフェッチ/永続関数を回避しようとしています。実際、NetBeansはEntity固有のJPAコントローラを生成します。私は汎用のものを扱おうとしています。 GenericEntityManager.persist(CurrencyPrice)と内部的には、各エンティティタイプのコードを記述/生成/維持する必要なく、CurrencyPriceを永続化する必要があるテーブルを内部的に把握しておくといいでしょう。 – kskblr07

+0

私はまだこれを試していませんが、いくつかのスレッド(例えば[this one](http://stackoverflow.com/questions/8119678/jpa-entity-inheritance-with-abstract-classes-constrainviolationexception))を読んだ後、私はそれが動作するはずだと確信しています。明らかに、具体的なサブクラスの1つをインスタンス化するだけで、抽象スーパータイプで宣言されたフィールドに割り当てることができます。そのフィールドをGenericEntityManagerに渡すことができます。 –

関連する問題