Должны ли быть обременены бизнес-логикой приложения? - PullRequest
0 голосов
/ 23 февраля 2019

Допустим, у нас есть такие классы в проекте 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 голосов
/ 23 февраля 2019

Вы можете переопределить равные в соответствии с вашей бизнес-логикой.В моем случае я исключил идентификатор. Вы можете изменить поля, которые используются с библиотекой lombok: https://projectlombok.org/features/EqualsAndHashCode

Например:

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

  private Integer id;

}
0 голосов
/ 23 февраля 2019

Так как есть два случая:

  1. сравнение двух сущностей по равенству (контенту)
  2. сравнение двух сущностей по идентификатору

Вы должныне переопределять equals, чтобы сделать либо или.Это было бы сбивающим с толку.Вместо этого используйте выделенную функцию для каждого.Таким образом, вы или кто-либо другой, читающий код, может выбрать правильный, и этот выбор будет очевиден для читателя.

0 голосов
/ 23 февраля 2019

Конечно, таким образом вы используете бизнес-идентификатор, а не тот, который, вероятно, сгенерирован поставщиком jpa, и в результате управляющие сущности равны тем, которые не являются.

Например, если мы создаем объект, в котором идентификатор генерируется базой данных, и сохраняем его, следующее не дает ошибок:

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

В большинстве случаев это не то, что нам нужно.Для более подробной информации я рекомендую эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...