【问题标题】: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 规范,实体类不能是最终的。

标签: java jpa persistence


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多