2013-02-06 20 views
10

2つのフィールドのみを含むテーブルがあります。表は、これら2つのフィールドによって形成される複合PKを有する。2つの主キーフィールドを持つJPAテーブル

データベースからエンティティBeanを作成するためにNetbeansを使用する場合、エンティティBeanは2つ以上のフィールドを持つ他のテーブルと同じように自動的には作成されません。

私はエンティティBeanを自分で作成する必要があると思います。このエンティティBeanを作成するためのベストプラクティスは何ですか? COMPOSITE KEYオブジェクトを含む必要がありますか?

+0

@ XaviLópez:彼らは一緒にPKを保有します。 – user2046810

答えて

27

私はNetBeansを使用しないので、マッピングツールについては何も言えません。

複合キーのマッピングには、いくつかのオプションがあります。あなた

  • PKフィールドで別の@Embeddableオブジェクトを定義し、あなたの@Entityクラスで@EmbeddedIdとしてそれを使用

    @Embeddable 
    public class MyCompositePK { 
        @Column 
        private String fieldA; 
        @Column 
        private String fieldB; 
    } 
    @Entity 
    public class MyBean { 
        @EmbeddedId 
        private MyCompositePK id; 
        @Column 
        private String fieldC; 
    } 
    
  • はPKフィールドで非マッピングされたPOJOを定義し、@IdClassとして使用することができます@Entityにあります。

    @Entity 
    @IdClass(value=ClassAB.ClassABId.class) 
    public class ClassAB implements Serializable { 
        private String idA; 
        private String idB; 
    
        @Id 
        @Column(name="ID_A") 
        public String getIdA(){ return idA; } 
        public void setIdA(String idA){ this.idA = idA; } 
    
        @Id 
        @Column(name="ID_B") 
        public String getIdB(){ return idB; } 
        public void setIdB(String idB){ this.idB = idB; } 
    
        static class ClassABId implements Serializable { 
         private String idA; 
         private String idB; 
    
         public String getIdA(){ return idA; } 
         public void setIdA(String idA){ this.idA = idA; } 
    
         public String getIdB(){ return idB; } 
         public void setIdB(String idB){ this.idB = idB; } 
    
         // implement equals(), hashcode() 
        } 
    } 
    

    この例では、ClassABIdは便宜上、静的な内部クラスです。

これらのオプションは、この質問に対するパスカル・ティヴェントの優れた答えでも説明されています。How to map a composite key with Hibernate?

この関連する質問では、これらのアプローチの違いについて説明します。Which anotation should I use: @IdClass or @EmbeddedIdフィールドの宣言は@IdClassのアプローチで重複していることに注意してください。

とにかく、私は2つのクラスを作成する代わりにはないと思います。だからこそ私はこの質問に答えました:Mapping a class that consists only of a composite PK without @IdClass or @EmbeddedId。これには休止状態特有の機能があるようです。

DB構造を制御できる場合は、複合キーの使用を避けることも考えられます。 There are some reasons to do so

+2

オブジェクトには2つの主キーフィールドしか含まれていないので、それ自身の 'IdClass'でもかまいませんか? –

+1

@TomAndersonそれは面白いです。私は試したことがありません。 [誰か](https://forum.hibernate.org/viewtopic.php?p=2419264)が成功しなかったようです。スペックはこれに発音していないようです。実装に依存する場合があります。 –

+1

@TomAnderson:IDクラスは複合キーの値だけに基づいてequals()メソッドを実装しなければならないので、そうは思いません。 –

0

ありがとう@XaviLópez。あなたの説明は、@Tom Andersonによって言及された独自のIdClassとして宣言されたコードを修正しました。 @Idカラムを持つ独自のIdClassとして宣言したとき、そのエンティティのリストを取得しているJPAクエリが結果リストの期待される "n"個のアイテムを返していましたが、そのリストの各アイテムはnullです。しかし、そのサイズ "n"が予想されます。リファクタリングの少ない静的な内部クラスに変更した後、正しい結果セットを返すことができます。

私によれば、自己参照IdClassは動作しません。自己は既にエンティティであり、永続コンテキスト内にある必要があるからです。私も同じタイプの主キーオブジェクトを持っている場合、永続コンテキストに2つの「同一の」オブジェクトが存在します。だから、許されてはならない。したがって、@IdClassという自己参照型は使用しないでください。静的な内部クラスをプライマリキーの型として作成します。

関連する問題