要在实体类上使用equals和hashcode,这就是问题所在

时间:2009-12-18 16:52:12

标签: hibernate jpa entity equals hashcode

我一直试图找出最好的方法来处理在实体上实现hashcode和equals是否通常是好的做法(我的意思是一般意义上的实体,但在大多数情况下它将是JPA实体)。

在Hibernate手册http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html的第24章中,它说明了......

  

识别所有人的自然键   实体,并使用它们映射它们   。实现equals()和   hashCode()来比较属性   这构成了自然的关键。

让.equals和.hashcode只包含这些自然键是有道理的,但是如果你有多个同一个实体的实例(相同的自然id,那么相同的哈希码)呢?看起来这种做法可能会在您的应用程序的其他地方产生微妙的影响。有没有人在大规模之前尝试过这个?

2 个答案:

答案 0 :(得分:6)

我之前已经尝试过大规模(或者至少在一个大量使用hibernate的应用程序中)。这是一个好主意。

  

让.equals和.hashcode只包含这些自然键是有道理的,但是如果你有多个同一个实体的实例(相同的自然id,那么相同的哈希码)呢?看起来这种做法可能会在您的应用程序的其他地方产生微妙的影响。

这就是它的意思。在比较.equals时,您通常想要同一实体的多个实例成功,是的,它在其他地方有影响。 IMO的影响是,事情会按预期发挥作用。

答案 1 :(得分:3)

当您希望Equals只是键时,有时候您希望Equals比较所有属性和时间。我们使用明确的辅助类已经取得了很大的成功,因此对于所比较的内容没有歧义。

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

Entity1.EqualsByKey...
Entity1.EqualsByProperties...