在覆盖实体中的 equals 时我应该检查集合吗?

Should I check collections when overriding equals in entities?

我想知道是否应该检查实体中的关系是否相等。假设我有以下实体:

@Entity
class A {
   // ...

   @OneToMany
   private List<B> bs = new ArrayList<B>();

   @Override
   public boolean equals(Object obj) {
       //...
       A other = (A) obj;
       if(!bs.equals(other.getBs())) return false;
       // ...
    }
}

@Entity
class B {
   // ...
}

我应该检查 bs 字段是否相等吗?它看起来有点奇怪,因为 bs 可能包含数千个实体。

是否检查所有成员实体的相等性是您对相等性定义的问题。请注意,如果不覆盖 hashCode() 也无法正确覆盖 equals() 以确保相同的对象具有相同的哈希码。

话虽如此,对于为 JPA 实体 classes 重写这些方法是否是个好主意,意见不一。如果您确实覆盖了它们,那么相等性可能应该仅基于 "business id" -- 属性 或实体的属性,这些实体定义其身份以用于业务目的,以区别于其自动生成的 PK。这使得相等性以一种无论实体对象的 PK 是否已被读取/分配都有效的方式回答问题 "do objects E1 and E2 represent the same persistent entity"。遵循该原则意味着您在您的决定中包含关联集合的元素。

如果您希望能够评估其他关于相等性的想法,请考虑提供一种不同的方法来评估它,甚至可以考虑提供不同的 class 负责执行此类比较。可能使您的实体 class Comparable 可以达到这个目的。