可嵌入的 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?的主要内容,如果未能解决你的问题,请参考以下文章
@Transient 属性应该用在 equals/hashCode/toString 中吗?