Ci sono state alcune discussioni qui sulle entità dell'APP e quale hashCode()
/ equals()
implementazione dovrebbe essere usata per le classi di entità dell'APP. Molti (se non tutti) dipendono da Hibernate, ma mi piacerebbe discuterne in modo neutrale sull'implementazione di JPA (sto usando EclipseLink, comunque).
Tutte le possibili implementazioni hanno i loro vantaggi e svantaggi per quanto riguarda:
hashCode()
/equals()
conformità del contratto (immutabilità) perList
/Set
operazioni- Se è possibile rilevare oggetti identici (ad esempio da sessioni diverse, proxy dinamici da strutture di dati caricati pigramente)
- Se le entità si comportano correttamente in stato distaccato (o non persistente)
Per quanto posso vedere, ci sono tre opzioni :
- Non ignorarli; fare affidamento su
Object.equals()
eObject.hashCode()
hashCode()
/equals()
lavoro- impossibile identificare oggetti identici, problemi con proxy dinamici
- nessun problema con entità distaccate
- Sostituiscili, in base alla chiave primaria
hashCode()
/equals()
sono rotti- identità corretta (per tutte le entità gestite)
- problemi con entità distaccate
- Sostituiscili, in base all'ID commerciale (campi chiave non primaria; che dire delle chiavi esterne?)
hashCode()
/equals()
sono rotti- identità corretta (per tutte le entità gestite)
- nessun problema con entità distaccate
Le mie domande sono:
- Ho perso un'opzione e / o un punto pro / con?
- Quale opzione hai scelto e perché?
AGGIORNAMENTO 1:
Per " hashCode()
/ equals()
sono interrotti", intendo che hashCode()
invocazioni successive possono restituire valori diversi, che (se implementati correttamente) non sono rotti nel senso della Object
documentazione API, ma che causano problemi quando si tenta di recuperare un'entità modificata da un Map
, Set
o altro basato sull'hash Collection
. Di conseguenza, le implementazioni JPA (almeno EclipseLink) non funzioneranno correttamente in alcuni casi.
AGGIORNAMENTO 2:
Grazie per le vostre risposte - la maggior parte di loro ha una qualità notevole.
Sfortunatamente, non sono ancora sicuro di quale approccio sarà il migliore per un'applicazione reale o come determinare l'approccio migliore per la mia applicazione. Quindi, terrò aperta la domanda e spero in ulteriori discussioni e / o opinioni.
hashcode()
la stessa istanza dell'oggetto dovrebbe restituire lo stesso valore, a meno che i campi utilizzati equals()
nell'implementazione non cambino. In altre parole, se hai tre campi nella tua classe e il tuo equals()
metodo ne utilizza solo due per determinare l'uguaglianza delle istanze, puoi aspettarti che il hashcode()
valore restituito cambi se cambi uno di quei valori del campo - il che ha senso se consideri che questa istanza dell'oggetto non è più "uguale" al valore rappresentato dalla vecchia istanza.