У меня есть класс BaseEntity
, который является суперклассом всех объектов JPA в моем приложении.Как реализовать методы equals() и 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;
}
Каждый 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
объекта
Так же, как примечание, спецификация JPA не требует от организации предоставлять определенную обработку для хэш-код/равно и использование DataNucleus в качестве реализации JPA ничего из этой формы не требуется. Очевидно, что некоторые другие (например, Hibernate?) Могут наложить это на вас – DataNucleus
@DataNucleus Не могли бы вы показать ссылку, указывающую, что Hibernate действительно налагает на вас что-либо в отношении 'equals()/hashCode()' (подсказка: сам спящий режим делает ** не ** вызывать 'equals()' и 'hashCode()' для объекта сущности). –