SpringData JPA複合キーの使用

3584 ワード

複合プライマリ・キーと連合プライマリ・キーの違い
複合プライマリ・キー:1つのテーブルで、2つのフィールドが一意のデータを決定します.
連合主キー:表A、表Bの2枚の表、中間表を通じて、2枚の表の対応関係を確定する.(中間表の3つのフィールド:id,表A_id,表B_id);このとき、中間テーブルのidを連合プライマリキーと呼ぶ.
Spring jpa複合プライマリキーの使用
使用シーン:オーダークラス、オーダー番号ORDER_NUM+受注サブ品目INNER_NUMは、2つのフィールドが複合プライマリ・キーを構成し、一意のデータを決定します.
  • 方式一:@Embeddableを使用してプライマリ・キー・クラスを注釈する.次に、エンティティクラスは自主キークラスを継承します.
  • 1 . 複合プライマリ・キー・クラスを作成します.ネーミングは、エンティティクラス名の後+PKでプライマリ・キー・クラスを区別できます.
    @Embeddable // 1.         ,    @Embeddable
    public class OrderPK implements Serializable { // 2.   Serializable  (     );
    
        @Column(name = "ORDER_NUM")
        private String orderNum; //    
        @Column(name = "INNER_NUM")
        private String innerNum; //    
    
        // 3.     
        //              public        (       ,           ,           )
        //                         ,              ,          
    
        // 4.   equals hashCode  。
        //          equals              ,EntityManger  find     Entity ,
        //             equals        。
        //          hashCode            
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof OrderPK)) return false;
    
            OrderPK orderPK = (OrderPK) o;
    
            if (orderNum != null ? !orderNum.equals(orderPK.orderNum) : orderPK.orderNum != null) return false;
            return innerNum != null ? innerNum.equals(orderPK.innerNum) : orderPK.innerNum == null;
        }
    
        @Override
        public int hashCode() {
            int result = orderNum != null ? orderNum.hashCode() : 0;
            result = 31 * result + (innerNum != null ? innerNum.hashCode() : 0);
            return result;
        }
    
        //    get set toString     
    }
    

    2 . エンティティ・クラスを作成し、プライマリ・キー・クラスを継承します.
    @Entity
    @Table(name = "ORDER")
    public class Order extends OrderPK {
    
        //           
        @EmbeddedId
        private OrderPK id;
    
        //          ,      ,     
    
        @Column(name = "OTHER_FIELD")
        private String otherField; //     
    
       //    get set toString     
    }
    
  • 方式2:@IdClassを用いて複合プライマリ・キーを注釈する;(推奨、複合主キーフィールド、実体クラスにおいて、直接体現され、簡単明瞭に見える)1.複合プライマリ・キー・クラスを作成します.
  • // @Embeddable
    public class OrderPK implements Serializable {
    
        // @Column(name = "ORDER_NUM")
        private String orderNum; //    
    
        // @Column(name = "INNER_NUM")
        private String innerNum; //    
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof OrderPK)) return false;
    
            OrderPK orderPK = (OrderPK) o;
    
            if (orderNum != null ? !orderNum.equals(orderPK.orderNum) : orderPK.orderNum != null) return false;
            return innerNum != null ? innerNum.equals(orderPK.innerNum) : orderPK.innerNum == null;
        }
    
        @Override
        public int hashCode() {
            int result = orderNum != null ? orderNum.hashCode() : 0;
            result = 31 * result + (innerNum != null ? innerNum.hashCode() : 0);
            return result;
        }
    
       //    get set toString     
    
    }
    

    2 . エンティティークラスの作成
    @Entity
    @Table(name = "ORDER")
    @IdClass(OrderPK.class) //    @IdClass    ,         
    public class Order implements Serializable { //            
    
    	//  @EmbeddedId
    	//  private OrderPK id;
    
        @Id //         
        @Column(name = "ORDER_NUM")
        private String orderNum; //    
    
        @Id //         
        @Column(name = "INNER_NUM")
        private String innerNum; //    
    
        @Column(name = "OTHER_FIELD")
        private String otherField; //     
    
        //    get set toString     
    }