2010-06-30 4 views
6

У меня есть класс 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 объекта

+1

Так же, как примечание, спецификация JPA не требует от организации предоставлять определенную обработку для хэш-код/​​равно и использование DataNucleus в качестве реализации JPA ничего из этой формы не требуется. Очевидно, что некоторые другие (например, Hibernate?) Могут наложить это на вас – DataNucleus

+0

@DataNucleus Не могли бы вы показать ссылку, указывающую, что Hibernate действительно налагает на вас что-либо в отношении 'equals()/hashCode()' (подсказка: сам спящий режим делает ** не ** вызывать 'equals()' и 'hashCode()' для объекта сущности). –

ответ

2

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

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

Да Это работало как expeted. – 2010-06-30 07:31:28

+0

http://stackoverflow.com/questions/1928191/what-is-the-correct-way-of-overriding-hashcode-and-equals-methods-of-persis – 2011-08-29 12:08:06