7

NHibernateエンティティクラスで常にEquals/GetHashCodeをオーバーライドする必要があると説明されている投稿がたくさんあります。セットを使用しない場合、これは本当に必要ですか?

Equals / GetHashCodeが欠落していると、予期しない誤った動作につながる可能性があることが示されているサンプルを見つけることができません。それらがなくてもすべてが完全に機能するようです。これは本当に奇妙で、誰もがこれが必要だと言っていますが、なぜこれが必要なのかを示すサンプルを誰も提供できません。

4

2 に答える 2

11

最近、指定されている場合でもNHibernateがselect N+1を実行することについてSOに質問がありましたfetch。問題Equals/GetHashCode実装の欠落にありました。

答えは別の同様の質問にリンクしています。

/オーバーライドの背後にある推論に関する別の質問があります。EqualsGetHashCode

三項関係を持つNhibernaten+1。
HQLフェッチNHibernateにもかかわらず、3値のNhibernateプロデュースプロキシの中間エンティティが必要
:EqualsとGetHashCodeをオーバーライドする理由NHibernateにとって
EqualsとGetHashCodeが非常に重要である
理由EqualsメソッドがオーバーライドされるときにGetHashCodeをオーバーライドすることが重要なのはなぜですか?


編集

それらを常にオーバーライドする必要はありません。複合キー、デタッチされたエンティティを持つ複数のセッション、またはステートレスセッションを使用している場合に必要になることがあります。

単一のセッションのみで作業している場合、NHibernateはIDマップを使用してエンティティを第1レベルのキャッシュに保存します。その場合のエンティティ比較は、IDを比較することによって行われます。

上記の場合(デタッチされたエンティティ、ステートレスセッション)、NHibernateはIDではなく実際のエンティティを比較します。デフォルトでObject.Equalsは、等式を参照します。したがって、2つのオブジェクトがまったく同じインスタンスを指している場合、それらは等しくなります。同じIDを持つ2つのインスタンスがあるかもしれませんが、それらのためにObject.Equals戻りfalseます。これはEntity 定義とは対照的です:

属性ではなく、連続性のスレッドとそのアイデンティティによって定義されるオブジェクト。

JBoss Hibernate wikiには、いくつかのコード例に関する優れた説明Equalsがあります。HashCode

于 2012-07-12T07:41:32.153 に答える
4

実際、それが副作用につながるのはまれなケースだけです。しかし、あなたがそれらを手に入れるならば、それらは非常に微妙です。複合主キーと辞書キーは別として、常に正しいEquals/GetHashCodeの実装が必要です。

NHは、エンティティをメモリ内で1回だけインスタンス化することを考慮しているため、デフォルトの参照比較が機能するはずです...遅延読み込みがない場合

Equalsをオーバーライドしないと、プロキシを処理するときに問題が発生します。プロキシと実体の2つのインスタンスが常にあります。それらは両方とも同じエンティティを表します。正しく実装されたEqualsメソッドでのみ、同じものとして扱われます。

于 2012-07-12T10:44:04.180 に答える