我一直试图找出最好的方法来处理在实体上实现hashcode和equals是否通常是好的做法(我的意思是一般意义上的实体,但在大多数情况下它将是JPA实体)。
在Hibernate手册http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html的第24章中,它说明了......
识别所有人的自然键 实体,并使用它们映射它们 。实现equals()和 hashCode()来比较属性 这构成了自然的关键。
让.equals和.hashcode只包含这些自然键是有道理的,但是如果你有多个同一个实体的实例(相同的自然id,那么相同的哈希码)呢?看起来这种做法可能会在您的应用程序的其他地方产生微妙的影响。有没有人在大规模之前尝试过这个?
答案 0 :(得分:6)
我之前已经尝试过大规模(或者至少在一个大量使用hibernate的应用程序中)。这是一个好主意。
让.equals和.hashcode只包含这些自然键是有道理的,但是如果你有多个同一个实体的实例(相同的自然id,那么相同的哈希码)呢?看起来这种做法可能会在您的应用程序的其他地方产生微妙的影响。
这就是它的意思。在比较.equals时,您通常想要同一实体的多个实例成功,是的,它在其他地方有影响。 IMO的影响是,事情会按预期发挥作用。
答案 1 :(得分:3)
当您希望Equals只是键时,有时候您希望Equals比较所有属性和时间。我们使用明确的辅助类已经取得了很大的成功,因此对于所比较的内容没有歧义。
ByKeyComparer.Equals...
ByPropertiesComparer.Equals...
或
Entity1.EqualsByKey...
Entity1.EqualsByProperties...