6

私は、エンティティにハッシュコードとイコールを実装することが一般的に良い方法であるかどうかを処理する最善の方法について推論しようとしています (一般的な意味でのエンティティを意味しますが、ほとんどの場合、JPA エンティティになります)。

Hibernate マニュアルhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.htmlの第 24 章には、次のように書かれています...

すべてのエンティティの自然キーを特定し、 を使用してそれらをマッピングします。equals() と hashCode() を実装して、自然キーを構成するプロパティを比較します。

.equals と .hashcode にこれらの自然キーのみを含めることは理にかなっていますが、同じエンティティのインスタンスが複数ある場合 (自然 ID が同じであるため、ハッシュコードが同じ) はどうでしょうか? このプラクティスは、アプリケーションの他の場所に微妙な影響を与える可能性があるようです。これを大規模に試した人はいますか?

4

2 に答える 2

6

以前にこれを大規模に(または少なくとも休止状態を多用するアプリケーションで)試しました。いい考えだね。

.equals と .hashcode にこれらの自然キーのみを含めることは理にかなっていますが、同じエンティティのインスタンスが複数ある場合 (自然 ID が同じであるため、ハッシュコードが同じ) はどうでしょうか? このプラクティスは、アプリケーションの他の場所に微妙な影響を与える可能性があるようです。

これがその目的です。通常、.equals を比較するときに同じエンティティの複数のインスタンスが成功することを望みます。そうです、それは他の場所に影響を与えますIMOの意味は、物事が期待どおりに機能するということです。

于 2009-12-18T16:57:22.470 に答える
3

Equalsですべてのプロパティを比較したい場合や、Equalsを単なるキーにしたい場合があります。明示的なヘルパークラスを使用することで、より多くの成功を収めたため、比較対象があいまいになることはありません。

ByKeyComparer.Equals...
ByPropertiesComparer.Equals...

また

Entity1.EqualsByKey...
Entity1.EqualsByProperties...
于 2009-12-18T16:57:23.730 に答える