Dois-je écrire equals() et hashCode() méthodes dans des entités JPA?
Je veux vérifier si l'entité est une Collection de membre (@OneToMany
ou @ManyToMany
) d'une autre entité:
if (entity2.getEntities1().contains(entity1)) { }
- Pour des précisions sur cette question de la motivation:
Collection.contains(JpaEntity someObject)
nécessite un raisonnableJpaEntity.equals(...)
méthode. - Voir aussi stackoverflow.com/a/39827962/548473 (spring-data-jpa mise en œuvre)
Vous devez vous connecter pour publier un commentaire.
Pas nécessairement. Il y a trois options:
ne supplantent pas - donc, vous allez travailler avec les instances. C'est d'amende dans le cas où vous travaillez avec les collections avec seulement les entités qui sont attachés à la session (et donc la garantie d'être à la même instance). C'est (pour moi) la méthode privilégiée dans de nombreux cas, car il nécessite moins de code et de la considération lors de la substitution
remplacer
hashCode()
etequals()
avec une clé d'entreprise. Peut-être un sous-ensemble de propriétés qui permettent d'identifier l'entité. Par exemple, pour unUser
une bonne clé d'entreprise pourrait être leusername
ou laemail
. Ceci est considéré comme une bonne pratique.remplacer
hashCode()
etequals()
à l'aide de l'ID de domaine seulement. C'est très bien, dans certains cas, surtout si vous avez une main-identifiant attribué (comme un UUID). C'est aussi bien si votre entité ne sera jamais aller dans une collection. Mais passagère entités (sans identifiant) qui entrent dans les collections, il provoque des problèmes, donc prudent avec cette option. Comme seanizer noté - vous devriez éviter. Généralement, toujours, à moins que vous êtes vraiment au courant de ce que vous faites (et peut-être en train de le documenter)Voir cet article pour plus de détails. Notez également que
equals()
ethashCode()
sont liés et doivent être mises en œuvre à la fois avec exactement les mêmes champs.@EqualsAndHashcode
annotation qui crée ces méthodes pour vous.Oui, vous devez définir correspondant
equals()
ethashcode()
méthodes, mais vous ne devriez JAMAIS laisser l'id de faire partie de l'un ou l'autre. (Voir cette récente réponse de la mine à une question similaire)Oui, vous devriez!
Si vous n'en avez pas, remplacer la valeur par défaut
Java.lang.Object
equals
ethashCode
mise en œuvre:la
merge
opération sera de retour une autre instance de l'objet et de l'égalité contrat va être cassé comme expliquer dans ce post.Le meilleur moyen est d'utiliser une clé d'entreprise, comme ceci:
Vous pouvez également utiliser l'identificateur de l'égalité, mais l'esprit que le hashCode de la mise en œuvre devrait toujours retourner la même valeur, comme expliqué dans le même poste que je l'ai déjà mentionné:
Il ya des informations dans la documentation Hibernate sur ce sujet.
Nous avons tendance à laisser IDE générer
hashCode()
etequals()
pour nous. Attention tout de même. Lorsque vous générez ces méthodes pour des Entités JPA. Certaines versions deequals()
vérifie identité de classeCe serait briser vos collections avec certains JPA bibliothèques les bibliothèques de créer des procurations pour vos entités (sous-classes), comme par exemple
MyGreatEntity_$$_javassist_7
en veille prolongée.Dans des Entités toujours autoriser les sous-classes dans
equals()
.C'est la seule façon. Vous pouvez essayer de Pojomatic de la bibliothèque qui fait le travail pour vous.