2015-04-16 11 views

Antwort

16

In dem Grails Buch „Programmieren Grails“ Burt sagt etwa gleich & hashCode (und ich hoffe, ich bin es hier immer), dass sie in Szenarien von Proxy-Nutzung umgesetzt werden sollen (wie wenn faul-Laden oder Customer.load() tun) und in einer Sammlung gespeichert werden. Denn wenn eine Proxy-Entität sowie eine nicht-proxietierte Entität in einer Sammlung gespeichert sind, werden sie nicht als das "gleiche" Objekt behandelt.

Da Hibernate normalerweise nicht proxiedierte Versionen einer Domäneninstanz verwendet, wenn sie bereits im Cache der ersten Ebene (der Hibernate-Sitzung) enthalten ist, tritt dieses Problem nur auf, wenn Sie ein Domänenobjekt haben, das sich nicht im aktuellen Ruhezustand befindet Sitzung (wie die http-Sitzung).

Wenn Sie so viel Standardcode vermeiden möchten, können Sie die Annotation verwenden @EqualsAndHashCode (siehe docs) wie folgt aus:

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

Weitere Informationen finden Sie unter „Programmieren Grails - Burt Beckwith“ First Edition, Seite 134.

+0

Danke für die Hilfe Mario! Ich habe vielleicht mehr Fragen zu diesem Thema, aber Sie haben mich in die richtige Richtung geleitet. –

-1

Standardmäßig haben sie keinen. Sie können eine ID erstellen, die mit einem eindeutigen und nicht nullfähigen Feld kombiniert wird. Ich habe gebeten, ein anderes Feld zu kombinieren, wie in irgendeinem Szenario (erinnere mich jetzt nicht) Ich habe ein Problem mit der ID konfrontiert, da die ID für diesen Datensatz vor dem Einfügen nicht vorhanden war.

+1

Es ist keine gute Idee, equals/hashCode basierend auf ID zu implementieren, und Sie sollten keine veränderbaren Felder in der equals/hashCode-Implementierung verwenden. Siehe diese Antwort für weitere Details http://stackoverflow.com/questions/29207268/ Best-Practice-in Bezug auf die Aufnahme von-ID-von-Domain-Modell-auf-gleich-Implementieren/29209554 # 29209554 –

Verwandte Themen