6

我一直在尝试推理处理在实体上实现哈希码和 equals 是否通常是一种好的做法的最佳方法(我的意思是一般意义上的实体,但在大多数情况下它将是 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 回答