2015-04-16 7 views

risposta

16

Nei Grails Grails Book "programmazione" Burt dice di uguale & hashCode (e spero sto proprio qui), che dovrebbero essere implementate in scenari di utilizzo di proxy (come quando si fa lazy-carico o Customer.load()) e conservati in una collezione. Perché se un'entità proxy e un'entità senza proxy sono archiviate in una raccolta, non vengono considerate come lo stesso oggetto.

Come Hibernate normalmente utilizza versioni non proxy di un'istanza di dominio se è già nella cache di primo livello (la sessione di Hibernate), questo problema si verifica solo se si dispone di un oggetto dominio, che non è nell'attuale ibernazione sessione (come la sessione http).

Se si vuole evitare che il codice standard molto, è possibile utilizzare l'annotazione @EqualsAndHashCode (vedi docs) come la seguente:

@EqualsAndHashCode(includes='firstName,lastName') 
class Customer { 
    String customerId 
    String firstName 
    String lastName 
} 

Per ulteriori informazioni consultare la sezione "Programmazione Grails - Burt Beckwith" First Edition, pagina 134.

+0

Grazie per l'aiuto Mario! Potrei avere altre domande su questo argomento, ma tu mi hai indicato nella giusta direzione. –

-1

Per impostazione predefinita, non ne hanno uno. Puoi crearne uno usando l'id che combina con un campo univoco e non nullo. Ho chiesto di combinare un altro campo come in alcuni scenari (non ricordo ora) ho affrontato il problema con id, dato che l'id non era presente per quel record prima dell'inserimento.

+1

Non è una buona idea implementare equals/hashCode in base all'id e non utilizzare campi mutabili nell'implementazione equals/hashCode Vedere questa risposta per ulteriori dettagli http://stackoverflow.com/questions/29207268/ best-practice-riguardo-l'-inclusione-di-id-del-dominio-modello-su-equali-implementa/29209554 # 29209554 –