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

5 java jpa equals tostring hashcode

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

每个JPA实体都延伸BaseEntity并继承idversion属性BaseEntity.

这里实施equals()hashCode()方法的最佳方法是BaseEntity什么?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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是instanceof运算符需要classtype而不是class对象; 那是:

  • if(other instanceof BaseEntity)

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

  • if(other instanceof this.getClass)

    这将无法工作,因为this.getClass()返回对象的类this对象

And*_*anu 4

你可以做

if (this.getClass().isInstance(other)) {
  // code
}
Run Code Online (Sandbox Code Playgroud)