2010-06-30 20 views
6

J'ai une classe BaseEntity qui est une super-classe de toutes les entités JPA dans mon application.Comment implémenter les méthodes equals() et hashcode() dans BaseEntity of 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; 
} 

entité Chaque JPA va de BaseEntity et héritera id et version attributs de BaseEntity.

Quelle est la meilleure façon d'implémenter les méthodes equals() et hashCode() dans BaseEntity? Chaque sous-classe de BaseEntity héritera equals() et hashCode() du formulaire de comportement BaseEntity.

Je veux faire quelque chose comme ceci:

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; 
     } 
    } 

Mais l'opérateur a besoin instanceof classtype et non objet de classe; qui est:

  • if(other instanceof BaseEntity)

    cela fonctionnera comme BaseEntity est ClassType ici

  • if(other instanceof this.getClass)

    cela ne fonctionnera pas parce que this.getClass() Retourne un objet de classe de this objet

+1

Tout comme une note, la spécification JPA ne nécessite pas des entités assurent un traitement particulier pour hashCode/égale et l'utilisation de DataNucleus comme une implémentation JPA ne nécessite rien de cette forme. Évidemment, d'autres (eg Hibernate?) Peuvent vous l'imposer – DataNucleus

+0

@DataNucleus Pourriez-vous montrer une référence indiquant qu'Hibernate vous impose quelque chose à propos de 'equals()/hashCode()' (indice: Hibernate ne fait pas ** ** appelle 'equals()' et 'hashCode()' sur un objet entité). –

Répondre

2

Vous pouvez faire

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

Oui Cela a fonctionné comme prévu. –

+0

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