最近、指定されている場合でもNHibernateがselect N+1を実行することについてSOに質問がありましたfetch
。問題はEquals
/GetHashCode
実装の欠落にありました。
答えは別の同様の質問にリンクしています。
/オーバーライドの背後にある推論に関する別の質問があります。Equals
GetHashCode
三項関係を持つ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