2017-10-05 49 views
1

Jpaエンティティ(MyEntity)に合成キーがある場合は、equals()とhashCode ()IDClass(この場合はID)に?重複とみなされますか?またはMyEntityの "e​​quals and hashCode()"では、IDクラス[return MyEntity.ID(id1、id2).hashCode();}を呼び出す必要があります。 MyEntityのhashCode()にありますか?jpaエンティティのIdClass(合成キー)でequals()とhashCode()をオーバーライドする必要があります

@Entity 
@IdClass(MyEntity.ID.class) 
public class MyEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    private long id1; 
    @Id 
    private long id2; 

    private String otherField; 
    public static class ID implements Serializable { 
     private static final long serialVersionUID = 1L; 
     private long id1; 
     private long id2; 
     public ID() { 
      super(); 
     } 
     public ID(long id1, long id2) { 
      super(); 
      this.id1 = id1; 
      this.id2 = id2; 
     } 
     public long getId1() { 
      return id1; 
     } 
     public void setId1(long id1) { 
      this.id1 = id1; 
     } 
     public long getId2() { 
      return id2; 
     } 
     public void setId2(long id2) { 
      this.id2 = id2; 
     } 
     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + (int) (id1^(id1 >>> 32)); 
      result = prime * result + (int) (id2^(id2 >>> 32)); 
      return result; 
     } 
     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) { 
       return true; 
      } 
      if (obj == null) { 
       return false; 
      } 
      if (getClass() != obj.getClass()) { 
       return false; 
      } 
      ID other = (ID) obj; 
      if (id1 != other.id1) { 
       return false; 
      } 
      if (id2 != other.id2) { 
       return false; 
      } 
      return true; 
     } 
    } 
    public MyEntity() { 
     super(); 
    } 
    public long getId1() { 
     return id1; 
    } 
    public void setId1(long id1) { 
     this.id1 = id1; 
    } 
    public long getId2() { 
     return id2; 
    } 
    public void setId2(long id2) { 
     this.id2 = id2; 
    } 
    public String getOtherField() { 
     return otherField; 
    } 
    public void setOtherField(String otherField) { 
     this.otherField = otherField; 
    } 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + (int) (id1^(id1 >>> 32)); 
     result = prime * result + (int) (id2^(id2 >>> 32)); 
     result = prime * result + ((otherField == null) ? 0 : otherField.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     MyEntity other = (MyEntity) obj; 
     if (id1 != other.id1) { 
      return false; 
     } 
     if (id2 != other.id2) { 
      return false; 
     } 
     if (otherField == null) { 
      if (other.otherField != null) { 
       return false; 
      } 
     } else if (!otherField.equals(other.otherField)) { 
      return false; 
     } 
     return true; 
    } 
} 
+0

私は両方のクラスで言う – XtremeBaumer

答えて

2

1.

は、私は(この場合はID)IdClass内のequals()とhashCode()を追加する必要があります良い記事?

はい、必要です。ここでthe documentationです:

複合主キー・クラスは、次の特性があります

...

  • それはイコールとhashCodeメソッドを定義します。これらのメソッドの値の等価性のセマンティクスは、キーがマップされるデータベース・タイプのデータベースの等価性と一致していなければなりません。

...

2.

またはMyEntityでは "等しいとhashCode()"、私は、[新しいMyEntity.ID(ID1、ID2).hashCode()を返すIDクラスのを呼び出す必要があります。 MyEntityのhashCode()にありますか?

あなたが実際に何を意味するかわかりませんが、IDクラスの新しいインスタンスを構築する必要はありません。ちょうど&のhasCode契約ルールをthe documentationから続けてください。 (IDEでの自動生成equalsとhasCodeもうまくいく)。

2

ここでは、この問題でJPA/Hibernate “Composite-id class does not override equals()”

を見てくださいequals() and hashCode()

に関するドキュメントからいくつかのアイテムは、我々はビジネスキー 平等を使用してequals()hashCode()の実装をお勧めします。ビジネスキーの等価は唯一のビジネスキーを形成する性質を比較し equals()方法は、キー は、現実の世界で対等の

質問(自然候補 キーを)私たちのインスタンスを識別することを意味します/ hashCodeは自明ではなく、ワンサイズの解決策もありません。

自然-IDを使用して、あなただけのユニークな制約を提供するエンティティの識別子を持って、時には のequalsとhashCode、最良のですが。

これは、回避策を必要とする 等価性チェックのためのエンティティの識別子を使用することは可能だが、それ:

あなたはハッシュ コード値は、エンティティの前後で変化しないようにハッシュコードのために一定の値を提供する必要がありますフラッシュされる。

非過渡エンティティのエンティティ識別子の同等性を比較する必要があります。また

EqualsandHashCode

関連する問題