假设我们在Java项目中有这样的类:
@Entity
class Person {
@Id
String internalId;
@OneToMany
Set<Profession> profession;
}
@Entity
class Profession {
@Id
String id;
String professionName;
Integer yearsOfPractise;
}
在业务逻辑中,professionName
对于每个人必须是唯一的。
@override
仅考虑equals
字段并累加其他字段,对professionName
是否正确?
一方面,如果从业务逻辑的角度处理此类,此类等式可能会派上用场。但是,如果必须从不同的角度来处理此类,那么这种平等可能是完全错误的,而且不方便。
如何决定?
答案 0 :(得分:4)
当然,您使用的是一种业务ID,而不是jpa供应商可能生成的业务ID,因此,要管理的实体等于不相同的实体。
例如,如果我们创建一个实体,该ID由数据库生成并保存,则以下内容不会出现错误:
Entity entity = new Entity();
Entity savedEntity = entityRepository.save(entity); // CrudReporitory
assertFalse(entity.equals(savedEntity));
在大多数情况下,这不是我们想要的。有关更多详细信息,我建议使用this article。
答案 1 :(得分:2)
您可以根据您的业务逻辑来覆盖平等。就我而言,我排除了id。您可以修改lombok库使用的字段: https://projectlombok.org/features/EqualsAndHashCode
例如:
@EqualsAndHashCode(exclude = "id")
public class Foo {
private Integer id;
}
答案 2 :(得分:0)
既然如此,有两种情况:
您不应覆盖equals
来执行或。这会令人困惑。而是为每个使用专用功能。这样,您(或其他任何阅读代码的人)都可以选择正确的代码,并且这种选择对于读者来说是显而易见的。