Soll ich schreiben equals() und hashCode() Methoden in der JPA-Entitäten?
Möchte ich überprüfen, ob Element in einer Auflistung Mitglied (@OneToMany
oder @ManyToMany
) von einer anderen Entität:
if (entity2.getEntities1().contains(entity1)) { }
- Um näher auf diese Frage ist die motivation:
Collection.contains(JpaEntity someObject)
erfordert eine angemesseneJpaEntity.equals(...)
Methode. - Siehe auch stackoverflow.com/a/39827962/548473 (spring-data-jpa-Implementierung)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht unbedingt. Es gibt drei Optionen:
nicht überschreiben - so arbeiten Sie mit Instanzen. Diese Ordnung ist in den Fällen, wenn Sie die Arbeit mit den Sammlungen, mit nur Entitäten, die befestigt sind, um die Sitzung (und somit garantiert die gleiche Instanz). Das ist (für mich) die bevorzugte Art und Weise, in vielen Fällen, denn es erfordert weniger code und weniger Rücksicht beim überschreiben
überschreiben
hashCode()
undequals()
mit einem business-Taste. Das kann eine Teilmenge der Eigenschaften, die Identifizierung der Person. Zum Beispiel, für eineUser
ein gutes Geschäft Schlüssel sein könnte, dieusername
oder dieemail
. Dies ist als gute Praxis zu empfehlen.überschreiben
hashCode()
undequals()
mit dem ID-Feld nur. Das ist in Ordnung, in einigen Fällen, vor allem, wenn Sie eine manuell zugewiesene Kennung (wie eine UUID). Es ist auch in Ordnung, wenn deine Einheit wird niemals in einer Sammlung. Aber für transiente Entitäten (ohne Kennung), die in Sammlungen, es verursacht Probleme, also vorsichtig mit dieser option. Als seanizer darauf hingewiesen - sollten Sie vermeiden. In der Regel immer, es sei denn, Sie sind wirklich bewusst, was Sie tun (und vielleicht auch Dokumentation)Finden Sie in diesem Artikel für mehr details. Beachten Sie auch, dass
equals()
undhashCode()
gebunden sind und umgesetzt werden sollten, die beide mit genau den gleichen Feldern.@EqualsAndHashcode
annotation erstellt, diese Methoden für Sie.Ja, Sie sollte!
Wenn Sie nicht überschreiben die Standard -
Java.lang.Object
equals
undhashCode
Umsetzung:den
merge
operation wird wieder ein anderes Objekt-Instanz und die Gleichheit Vertrag wird gebrochen werden wie erklären Sie in diesem Beitrag.Der beste Weg ist, verwenden Sie einen business key, wie diese:
Können Sie auch die Bezeichner für die Gleichstellung, sondern daran, dass die hashCode-Implementierung sollte immer den gleichen Wert zurückgeben, wie in der gleichen post, die ich bereits erwähnt:
Ja, Sie sollte definieren, entsprechende
equals()
undhashcode()
Methoden, aber Sie sollten lassen Sie NIEMALS die id-Teil. (Siehe dieser letzten Antwort von mir in einer ähnlichen Frage)Es gibt Informationen, die in der Hibernate-Dokumentation zu diesem Thema.
Neigen wir dazu, uns zu lassen, IDE generieren
hashCode()
undequals()
für uns. Seien Sie vorsichtig, wenn. Wenn Sie generieren diese Methoden für die JPA-Entitäten. Einige Versionen vonequals()
Prüfungen für die Klasse " identityDiese brechen würden Ihre Sammlungen mit einigen JPA-Bibliotheken diese Bibliotheken erstellen, proxies, um Ihre Entitäten (Unterklassen), wie zum Beispiel
MyGreatEntity_$$_javassist_7
im Ruhezustand.In Entitäten immer zulassen Unterklassen in
equals()
.Ist das der einzige Weg. Sie möchten möglicherweise versuchen, Pojomatic Bibliothek übernimmt die harte Arbeit für Sie.