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

Posted

技术标签:

【中文标题】如何在 JPA 的 BaseEntity 中实现 equals() 和 hashcode() 方法?【英文标题】:How to implement equals() and hashcode() methods in BaseEntity of JPA? 【发布时间】:2011-03-09 23:55:54 【问题描述】:

我有一个 BaseEntity 类,它是我的应用程序中所有 JPA 实体的超类。

@MappedSuperclass
public abstract class BaseEntity implements Serializable 

    private static final long serialVersionUID = -3307436748176180347L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable=false, updatable=false)
    protected long id;


    @Version
    @Column(name="VERSION", nullable=false, updatable=false, unique=false)
    protected long version;

每个 JPA 实体都从 BaseEntity 扩展而来,并继承 BaseEntityidversion 属性。

BaseEntity 中实现equals()hashCode() 方法的最佳方式是什么? BaseEntity 的每个子类都将继承 equals()hashCode() 行为形式 BaseEntity

我想做这样的事情:

public boolean equals(Object other)
        if (other instanceof this.getClass()) //this.getClass() gives class object but instanceof operator expect ClassType; so it does not work
            return this.id == ((BaseEntity)other).id;
         else 
            return false;
        
    

但是instanceof 操作符需要类类型而不是类对象;那就是:

if(other instanceof BaseEntity)

这将起作用,因为 BaseEntity 在这里是 classType

if(other instanceof this.getClass)

这不起作用,因为this.getClass() 返回this 对象的类对象

【问题讨论】:

请注意,JPA 规范不要求实体为 hashCode/equals 提供特定处理,并且使用 DataNucleus 作为 JPA 实现不需要任何这种形式。显然,其他一些人(例如 Hibernate?)可能会将其强加给您 @DataNucleus 您能否提供一个参考,指出 Hibernate 确实对您施加了任何与 equals()/hashCode() 相关的事情(提示:Hibernate 本身确实调用 equals() 和 @987654342 @ 在实体对象上)。 【参考方案1】:

你可以的

if (this.getClass().isInstance(other)) 
  // code

【讨论】:

***.com/questions/1928191/…

以上是关于如何在 JPA 的 BaseEntity 中实现 equals() 和 hashcode() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在jpa中实现自动增量

如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?

如何在 JPA 和自定义 UUID 标识符中实现批量插入

Spring JPA:BaseEntity 未映射

在每个模型的不同 DAL 类中实现 JPA 存储库方法时如何避免重复的代码行/代码块

如何在 Spring Boot 中实现通用 JPA 存储库 - 它可以自动装配到任何实体/类类型的 Spring 服务中