我想知道我是否应该检查实体中的关系是否相等。假设我有以下实体:
@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
可能包含数千个实体。
答案 0 :(得分:1)
您是否检查所有成员实体的相等性是您对相等性定义的问题。请注意,在不覆盖equals()
的情况下,您无法正确覆盖hashCode()
,以确保相等的对象具有相同的哈希码。
话虽如此,但是根据JPA实体类覆盖这些方法是否一个好主意,意见各不相同。如果你覆盖它们,那么相等应该只基于“业务ID” - 为业务目的定义其身份的实体的属性,与其自动生成的PK不同。这使得等式回答问题“对象E1和E2代表相同的持久实体”,其方式无论是否已经读取/分配了实体对象的PK。遵循该原则意味着您不在您的决定中包含相关集合的元素。
如果您希望能够评估其他一些相同的概念,那么请考虑提供一种不同的方法来评估它,或者甚至是另一个负责执行此类比较的类。可能使您的实体类Comparable
可以达到此目的。