java - 为什么在定义复合键类时需要equals和hashcode?
问题描述
我有这个类,并遵循了一个关于在 Spring Boot 中创建复合键类的教程,我可以知道是谁调用了这个等于和哈希码,以及在将对象映射到数据库表时它的目的是什么。
public class CustomerOrderPK implements Serializable {
@Column(name = "customer_id")
private Long customerId;
@Column(name = "order_id")
private Long orderId;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CustomerOrderPK that = (CustomerOrderPK) o;
return Objects.equals(customerId, that.customerId) && Objects.equals(orderId, that.orderId);
}
@Override
public int hashCode() {
return Objects.hash(customerId, orderId);
}
}
解决方案
复合键类表示实体的主键,因此它应该是唯一的。Hibernate 在内部使用equals
和hashcode
方法来识别唯一性、比较对象和检查重复。要在 Java 中进行这些操作,您必须实现equals
和hashcode
方法。
实现equals
和hashcode
方法,您指定您的自定义业务逻辑。在您的示例中,CustomerOrderPK
保证客户不能两次拥有相同的订单CustomerOrderPK
,因为是主键。如果你不覆盖equals
and hashcode
,Hibernate 将不知道如何比较对象并且CustomerOrderPK
不能被视为主键。
推荐阅读
- c++ - 为什么 C++ 向量交换方法具有恒定的时间复杂度
- django-3.0 - django3文件上传默认权限是420?
- ruby-on-rails - 如何修复损坏的系统 Ruby 安装
- git - 当你想在 github 上使用 Gatsby 实现的博客并在另一台计算机上使用时,如何构建?
- python - ROS通用目录定义
- html - 在 Google 表格中查找 X-Path/加载数据
- .net-core - 在 .Net Core 3.1 中,如何从代码覆盖范围中排除自动属性?
- chromium - 是否可以在 blazor SPA 中嵌入铬浏览器
- java - Fragment 中的空回收站视图
- nfc - 一次读取 emv 中的所有可用记录