可嵌入的 jpa 类是不是应该实现 equals 和 hashCode?

Posted

技术标签:

【中文标题】可嵌入的 jpa 类是不是应该实现 equals 和 hashCode?【英文标题】:Should embeddable jpa class implement equals and hashCode?可嵌入的 jpa 类是否应该实现 equals 和 hashCode? 【发布时间】:2011-06-13 08:25:30 【问题描述】:

假设我有以下场景:

@Entity
public class Person 
    @Id
    private Long id; //Surrogate key

    @Embedded
    private Name name; //Natural key

    public int hashCode() 
        ... //based on natural key Name
    
    public boolean equals(Object obj) 
        ... //based on natural key Name
    


@Embeddable
public class Name 
    private String firstName;
    private String middleName;
    private String lastName;

    //Should I implement equals/hashCode baseed on the three fields?

Name 类是否应该在 Name 类上实现 equals 和 hashCode 以使 Person equals 正常工作?

对于将用作 EmbeddedId 的 Embeddable 对象是必须的。但在本例中,我使用的是代理键。

【问题讨论】:

你确定“名字”真的是独一无二的吗?不难想象两个人同名的情况。 这只是一个例子。不是真实的场景。 请注意...您的 Person 类不是 final。你应该意识到,如果你扩展 Person 你的 equals 会被破坏,因为正如 Joshua Bloch 在 "Effective Java" 中所说的那样:那里根本无法在保留 equals 合同的同时扩展可实例化的类。我不知道 "Effective Java" 什么时候问世(2001 年?),但我相信有一天人们会承认有 equals() Java OO 层次结构顶部的 hashCode() 是 Gosling 最大的大脑放屁之一 ;) [在此之前就知道 OO 问题,但 Effective Java 往往是权威的]跨度> 根据 JPA 规范,实体类不能是最终的。 【参考方案1】:

我不相信 JPA 会要求您实现 equals 和 hashcode。 Hibernate 曾经使用过,但最近对文档的审查表明这不再是必需的。

当然,实现 hashcode 和 equals 总是一个好主意。

【讨论】:

以上是关于可嵌入的 jpa 类是不是应该实现 equals 和 hashCode?的主要内容,如果未能解决你的问题,请参考以下文章

spring data jpa:插入而不是删除

JPA注解

@Transient 属性应该用在 equals/hashCode/toString 中吗?

随记Spring Data JPA的几个坑

如何在 JPA 的 BaseEntity 中实现 equals() 和 hashcode() 方法?

JPA 可嵌入 PK 和可为空的字段