java—应用程序的业务逻辑是否应该加重equals的负担?

vql8enpb  于 2021-07-14  发布在  Java
关注(0)|答案(3)|浏览(270)

假设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 场和其他人?
一方面,如果从业务逻辑的Angular 处理这个类,那么这样的equals就很方便了。但是当这个类必须从不同的Angular 来处理时,这样的等号可能是完全错误的和不好的。
如何决定?

ehxuflar

ehxuflar1#

当然,通过这种方式,您使用的是业务id,而不是jpa供应商可能生成的业务id,因此,被管理的实体与不被管理的实体相等。
例如,如果我们创建一个实体,其中id由数据库生成并保存,则以下不会给出错误:

Entity entity = new Entity();
Entity savedEntity = entityRepository.save(entity); // CrudReporitory
assertFalse(entity.equals(savedEntity));

在大多数情况下,这不是我们想要的。更多细节,我推荐这篇文章。

p3rjfoxz

p3rjfoxz2#

你可以根据你的业务逻辑来超越等号。在我的例子中,我排除了id。您可以修改lombok库使用的字段:https://projectlombok.org/features/equalsandhashcode
例如:

@EqualsAndHashCode(exclude = "id")
public class Foo {

  private Integer id;

}
vshtjzan

vshtjzan3#

因为,有两种情况:
相等比较两个实体(内容)
通过标识符比较两个实体
你不应该重写 equals 要么做要么做。这会让人困惑。相反,每个函数都使用一个专用函数。通过这种方式,您/或其他阅读代码的人可以选择正确的代码,并且这种选择对读者来说是显而易见的。

相关问题