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オブジェクトは必須です。しかし、この例では私はサロゲートキーを使用しています。
「名前」は本当にユニークになると確信していますか? 2人が同じ名前を持つ状況を想像するのは難しいことではありません。 –
これは単なる例でした。実際のシナリオではありません。 –
ちょうどメモ...あなたの* Person *クラスは* final *ではありません。ジョシュア・ブロッホが "効果的なJava" *を書いているように、* Person ** * equals *を拡張すると、equals契約を維持しながらインスタンス化可能なクラスを拡張することはできません** 。 *「効果的なJava」*が出てきたのは分かりませんが(2001年?)、Java OOのトップレベルの* equals()*と* hashCode()階層はゴスリングの最大の脳のおならでした;)[OOの問題はその前に知られていましたが、効果的なJava *は権威ある傾向があります] – SyntaxT3rr0r