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 dethis
objet
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
@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é). –