Es gab bereits einige Diskussionen hier über JPA-Entitäten und welche hashCode()
/ equals()
Implementierung sollte für JPA-Entitätsklassen verwendet werden. Die meisten (wenn nicht alle) von ihnen hängen von Hibernate ab, aber ich möchte sie JPA-Implementierung-neutral diskutieren (ich verwende übrigens EclipseLink).
Alle möglichen Implementierungen haben ihre eigenen Vorteile y Nachteile in Bezug auf:
hashCode()
/equals()
Vertrag Konformität (Unveränderlichkeit) fürList
/Set
Operationen- Ob identisch Objekte (z.B. aus verschiedenen Sitzungen, dynamische Proxys aus faul geladenen Datenstrukturen) erkannt werden können
- Ob sich Entitäten korrekt verhalten in losgelöster (oder nicht-unterbrochener) Zustand
Soweit ich sehen kann, gibt es drei Möglichkeiten :
- Setzen Sie sie nicht außer Kraft; verlassen Sie sich auf
Object.equals()
yObject.hashCode()
hashCode()
/equals()
Arbeit- kann identische Objekte nicht identifizieren, Probleme mit dynamischen Proxys
- keine Probleme mit abgetrennten Einheiten
- Überschreiben Sie sie, basierend auf den Primärschlüssel
hashCode()
/equals()
gebrochen sind- korrekte Identität (für alle verwalteten Einheiten)
- Probleme mit abgetrennten Einheiten
- Überschreiben Sie sie, basierend auf den Business-Id (nicht primäre Schlüsselfelder; was ist mit Fremdschlüsseln?)
hashCode()
/equals()
gebrochen sind- korrekte Identität (für alle verwalteten Einheiten)
- keine Probleme mit abgetrennten Einheiten
Meine Fragen sind:
-
Habe ich eine Option und/oder ein Pro-/Kontra-Argument übersehen?
-
Welche Option haben Sie gewählt und warum?
UPDATE 1:
Von " hashCode()
/ equals()
kaputt sind", meine ich, dass aufeinanderfolgende hashCode()
Aufrufen unterschiedliche Werte zurückgeben können, was (bei korrekter Implementierung) nicht im Sinne der Object
API-Dokumentation, die aber Probleme verursacht, wenn man versucht, eine geänderte Entität aus einer Map
, Set
oder andere Hash-basierte Collection
. Folglich werden JPA-Implementierungen (zumindest EclipseLink) in einigen Fällen nicht korrekt funktionieren.
UPDATE 2:
Vielen Dank für Ihre Antworten - die meisten von ihnen haben eine bemerkenswerte Qualität.
Leider bin ich mir immer noch nicht sicher, welcher Ansatz für eine reale Anwendung am besten geeignet ist, oder wie ich den besten Ansatz für meine Anwendung ermitteln kann. Ich werde die Frage also offen lassen und hoffe auf weitere Diskussionen und/oder Meinungen.