当覆盖实体中的等于时,我应该检查集合吗?

时间:2015-07-04 14:30:31

标签: java jpa equals equality

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

@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可能包含数千个实体。

1 个答案:

答案 0 :(得分:1)

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

话虽如此,但是根据JPA实体类覆盖这些方法是否一个好主意,意见各不相同。如果你覆盖它们,那么相等应该只基于“业务ID” - 为业务目的定义其身份的实体的属性,与其自动生成的PK不同。这使得等式回答问题“对象E1和E2代表相同的持久实体”,其方式无论是否已经读取/分配了实体对象的PK。遵循该原则意味着您在您的决定中包含相关集合的元素。

如果您希望能够评估其他一些相同的概念,那么请考虑提供一种不同的方法来评估它,或者甚至是另一个负责执行此类比较的类。可能使您的实体类Comparable可以达到此目的。