Как правильно создать 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 шт):
Ответ зависит от ответа на вопрос: с точки зрения вашей бизнес логики когда 2 разных Entity например Author будут считаться идентичными? 3 варианта:
- Когда их первичные ключи равны. В этом случае
hashCode()это просто ихid - Когда имя и фамилии авторов идентичны, в этом случае
hashCode()вычисляется как композиция типаhash(name+surname)(гдеhash()более-менее любой алгоритм хэширования типа SHA-256 или даже md5 - Ни то ни другое. В этом случае при создании записи вам надо генерить некий
businessKeyкоторый будет вычисляться черезAtomic(правда чем это отличается отid- мне сложно понять)