Dois-je écrire les méthodes equals () dans les entités JPA?

Je veux vérifier si l’entité est dans un membre Collection ( @OneToMany ou @ManyToMany ) d’une autre entité:

 if (entity2.getEntities1().contains(entity1)) { } 

Pas nécessairement. Il y a trois options:

  • ne pas écraser – vous travaillerez donc avec des instances. Cela convient parfaitement dans les cas où vous travaillez avec les collections avec uniquement des entités associées à la session (et donc garantis comme étant la même instance). C’est (pour moi) la méthode préférée dans de nombreux cas, car cela nécessite moins de code et moins de considération lors de la substitution

  • Remplacez hashCode() et equals() par une clé métier. Cela peut être un sous-ensemble de propriétés identifiant l’entité. Par exemple, pour un User une bonne clé professionnelle peut être le username ou le email . Ceci est considéré comme une bonne pratique.

  • redéfinit hashCode() et equals() utilisant uniquement le champ ID. C’est bien dans certains cas, surtout si vous avez un identifiant atsortingbué manuellement (comme un UUID). C’est aussi bien si votre entité n’ira jamais dans une collection. Mais pour les entités transitoires (sans identifiant) qui entrent dans les collections, cela pose problème, donc attention à cette option. Comme l’a noté le nettoyeur – vous devriez l’éviter. Généralement, toujours, sauf si vous êtes vraiment au courant de ce que vous faites (et peut-être le documentez)

Voir cet article pour plus de détails. Notez également que equals() et hashCode() sont liés et doivent être implémentés avec exactement les mêmes champs.

Oui, vous devez définir les méthodes equals() et hashcode() , mais vous ne devez JAMAIS laisser l’id faire partie de l’une ou l’autre. (Voir cette réponse récente de la mienne dans une question similaire)

Il existe des informations dans la documentation Hibernate sur ce sujet.

Nous avons tendance à laisser IDE générer hashCode() et equals() pour nous. Attention cependant. Lorsque vous générez ces méthodes pour les entités JPA. Certaines versions de equals() vérifient l’identité de la classe

 // ... inside equals() - wrong approach for Entities (cause of generate proxies) if (o == null || this.getClass() != o.getClass()) { return false; } // ... 

Cela briserait vos collections avec certaines bibliothèques JPA, car ces bibliothèques créent des proxy vers vos entités (sous-classes), comme par exemple MyGreatEntity_$$_javassist_7 dans Hibernate.

Dans Entités, autoriser toujours les sous-classes dans les equals() .

Oui tu devrais!

Si vous ne remplacez pas le Java.lang.Object par défaut, il equals implémentation hashCode :

 @Entity(name = "Book") public class Book implements Identifiable { @Id @GeneratedValue private Long id; private Ssortingng title; //Getters and setters omitted for brevity } 

l’opération de merge renverra une instance d’object différente et le contrat d’égalité sera rompu comme expliqué dans cet article .

Le meilleur moyen est d’utiliser une clé professionnelle, comme ceci:

 @Entity public class Book implements Identifiable { @Id @GeneratedValue private Long id; private Ssortingng title; @NaturalId private Ssortingng isbn; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Book)) return false; Book book = (Book) o; return Objects.equals(getIsbn(), book.getIsbn()); } @Override public int hashCode() { return Objects.hash(getIsbn()); } //Getters and setters omitted for brevity } 

Vous pouvez également utiliser l’identifiant pour l’égalité, mais gardez à l’esprit que l’implémentation hashCode doit toujours renvoyer la même valeur que celle expliquée dans le même post que j’ai déjà mentionné:

 @Entity public class Book implements Identifiable { @Id @GeneratedValue private Long id; private Ssortingng title; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Book)) return false; Book book = (Book) o; return Objects.equals(getId(), book.getId()); } @Override public int hashCode() { return 31; } //Getters and setters omitted for brevity } 

C’est la seule façon. Vous voudrez peut-être essayer la bibliothèque Pojomatic qui fait le travail difficile pour vous.