应该由应用程序的业务逻辑来负担平等吗?

时间:2019-02-23 15:45:26

标签: java scala hibernate jpa kotlin

假设我们在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是否正确?

一方面,如果从业务逻辑的角度处理此类,此类等式可能会派上用场。但是,如果必须从不同的角度来处理此类,那么这种平等可能是完全错误的,而且不方便。

如何决定?

3 个答案:

答案 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)

既然如此,有两种情况:

  1. 按相等性(内容)比较两个实体
  2. 通过标识符比较两个实体

您不应覆盖equals来执行或。这会令人困惑。而是为每个使用专用功能。这样,您(或其他任何阅读代码的人)都可以选择正确的代码,并且这种选择对于读者来说是显而易见的。