Как реализовать методы equals() и hashcode() в BaseEntity JPA?

У меня есть класс 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 и наследует id и version атрибуты 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;
        }
    }

Но оператору instanceof нужен classtype, а не объект класса; то есть:

  • if(other instanceof BaseEntity)

    это будет работать как BaseEntity здесь classType

  • if(other instanceof this.getClass)

    это не будет работать, потому что this.getClass() возвращает объект класса объекта this

Ответ 1

Вы можете сделать

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