背景:
我在几个来源中阅读了有关在使用 Hibernate 时equals()最好hashcode()覆盖的内容。以前,我没有遇到过这个,所以我想为自己澄清/找出一些事情。
第 45 条:为什么在实体中避免使用 Lombok @EqualsAndHashCode
这是另一个:
使用 JPA 和 Hibernate 实现 equals、hashCode 和 toString 的最佳方法
这是另一个:
使用 Hibernate 实现 equals() 和 hashCode() 的终极指南
情况:
上面引用的消息来源谈到了如何创建hashCode()和equals(). equals()我了解情况,但hashCode()不太了解。
我有 2 个,比如说 2 个实体(彼此独立):Author和Book.
“禁忌”:
Object.hash(id)将不起作用,因为id在将休眠状态发送到数据库后接收到对象。- 我的对象没有
Business Keyor@NaturalId,因为 字段将不是唯一的
因此,据我了解,解决问题的一种选择hashCode()是“重写”此方法并手动插入一个数字(int)。最常用的基元,奇数是 31。
问题:
1 - 如何正确发给hashCode()以下实体?(最好给出这些数字的例子)它表示该数字是否必须满足某些标准,公式等。
2 - 应用程序中创建的所有/几个实体可以具有相同的hashCode(),但风险是什么?
更新1:
作者.java
@Entity
@Getter
@Setter
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String surname;
}
图书.java
@Entity
@Getter
@Setter
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
private String edition;
}

答案取决于问题的答案:从您的业务逻辑的角度来看,
Entity例如2 个不同的,什么时候会Author被认为是相同的?3个选项:hashCode(),只有他们idhashCode()计算为一种类型组合hash(name+surname)(其中hash()或多或少有任何散列算法,如 SHA-256 甚至 md5businessKey将通过计算的特定记录Atomic(尽管这有什么不同id- 我很难理解)