11

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

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

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

4

2 に答える 2

30

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

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

  • @EmbeddablePK フィールドを使用して別のオブジェクトを定義し、クラスで使用@EmbeddedId します。@Entity

    @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では、便宜上、静的内部クラスを使用しています。

これらのオプションは、この質問に対する Pascal Thivent の優れた回答でも説明されています: How to map a complex key with Hibernate? .

この関連する質問では、これらのアプローチの違いについて説明しています: @IdClass または @EmbeddedId を使用する必要があります@IdClassフィールドの宣言がアプローチと重複していることに注意してください。

とにかく、2 つのクラスを作成する以外に方法はないと思います。それが私がこの質問をした理由です: @IdClass または @EmbeddedId のない複合 PK のみで構成されるクラスをマッピングします。これには休止状態固有の機能があるようです。

補足として、DB 構造を制御できる場合は、複合キーを避けることも検討してください。これにはいくつかの理由があります

于 2013-02-06T12:45:17.327 に答える