首页 > 解决方案 > 为什么在定义复合键类时需要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);
    }
}


标签: javaspring-boothibernatespring-data-jpa

解决方案


复合键类表示实体的主键,因此它应该是唯一的。Hibernate 在内部使用equalshashcode方法来识别唯一性、比较对象和检查重复。要在 Java 中进行这些操作,您必须实现equalshashcode方法。

实现equalshashcode方法,您指定您的自定义业务逻辑。在您的示例中,CustomerOrderPK保证客户不能两次拥有相同的订单CustomerOrderPK,因为是主键。如果你不覆盖equalsand hashcode,Hibernate 将不知道如何比较对象并且CustomerOrderPK不能被视为主键。


推荐阅读