Как правильно создать hashCode() для сущностей в Hibernate

Предыстория:

Прочитал в нескольких источниках о том, что equals() и hashcode() лучше всего перезаписывать, когда работаешь с Hibernate. Раньше мне с этим не приходило встречаться, поэтому хотел бы для себя уточнить/узнать некоторые вещи.

Item 45: Why Avoid Lombok @EqualsAndHashCode in Entities введите сюда описание изображения


Вот еще один :
The best way to implement equals, hashCode, and toString with JPA and Hibernate

И вот еще один:
Ultimate Guide to Implementing equals() and hashCode() with Hibernate

Ситуация:

В источниках, приведенных выше, говорилось о том, как создавать hashCode() и equals(). Ситуацию с equals() я понял, а вот с hashCode() - не очень.

У меня есть 2, предположим, 2 сущности (независимые друг от друга): Author и Book.
"Запреты":

  • Object.hash(id) не подойдет, так как id объект получает после отправки hibernate в БД.
  • У моих объектов нету Business Key или @NaturalId, т.к. поля будут НЕ УНИКАЛЬНЫМИ

Таким образом, остается, как я понял, один вариант решения проблем с hashCode() - это "переписывать" данный метод и вручную вставлять число (int). Чаще всего используют примитивное, нечетное число 31.

Вопросы:

1 - Как правильно выдавать hashCode() нижепредставленным сущностям? (желательно привести пример этих чисел) Имеется ввиду должно ли число удовлетворять каким-нибудь критериям, формуле и т.д.
2 - Могут ли все/несколько сущности, которые созданы в приложении, иметь одинаковые hashCode(), но чем это черевато?

Update 1:

Вот информация из 3 истоника (см. выше). Что это могло бы значить? введите сюда описание изображения

Author.java

@Entity
@Getter
@Setter
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private String surname;
}

Book.java

@Entity
@Getter
@Setter
public class Book { 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String title;

    private String edition;
}

Ответы (1 шт):

Автор решения: Barmaley Red Star

Ответ зависит от ответа на вопрос: с точки зрения вашей бизнес логики когда 2 разных Entity например Author будут считаться идентичными? 3 варианта:

  1. Когда их первичные ключи равны. В этом случае hashCode() это просто их id
  2. Когда имя и фамилии авторов идентичны, в этом случае hashCode() вычисляется как композиция типа hash(name+surname) (где hash() более-менее любой алгоритм хэширования типа SHA-256 или даже md5
  3. Ни то ни другое. В этом случае при создании записи вам надо генерить некий businessKey который будет вычисляться через Atomic (правда чем это отличается от id - мне сложно понять)
→ Ссылка