2011-01-21 11 views
4

はのは、私は次のシナリオがあるとしましょう:embeddable jpaクラスはequalsとhashCodeを実装する必要がありますか?

@Entity 
public class Person { 
    @Id 
    private Long id; //Surrogate key 

    @Embedded 
    private Name name; //Natural key 

    public int hashCode() { 
     ... //based on natural key Name 
    } 
    public boolean equals(Object obj) { 
     ... //based on natural key Name 
    } 
} 

@Embeddable 
public class Name { 
    private String firstName; 
    private String middleName; 
    private String lastName; 

    //Should I implement equals/hashCode baseed on the three fields? 
} 

は人が適切に仕事に等しいという順に名前クラス上のイコールとhashCodeを実装するクラスを指定すべき?。

EmbeddedIdとして使用されるEmbeddableオブジェクトは必須です。しかし、この例では私はサロゲートキーを使用しています。

+0

「名前」は本当にユニークになると確信していますか? 2人が同じ名前を持つ状況を想像するのは難しいことではありません。 –

+1

これは単なる例でした。実際のシナリオではありません。 –

+0

ちょうどメモ...あなたの* Person *クラスは* final *ではありません。ジョシュア・ブロッホが "効果的なJava" *を書いているように、* Person ** * equals *を拡張すると、equals契約を維持しながらインスタンス化可能なクラスを拡張することはできません** 。 *「効果的なJava」*が出てきたのは分かりませんが(2001年?)、Java OOのトップレベルの* equals()*と* hashCode()階層はゴスリングの最大の脳のおならでした;)[OOの問題はその前に知られていましたが、効果的なJava *は権威ある傾向があります] – SyntaxT3rr0r

答えて

4

JPAでequalsとhashcodeを実装する必要があるとは思われません。 Hibernateはこれまで慣れ親しんでいましたが、ドキュメントの最近のレビューから、これはもはや要件ではないことが示されています。

もちろん、ハッシュコードと等価を実装することは常に良い考えです。

関連する問題