Das Problem liegt bei Ihrem hashCode
Implementierung auf Price
.
Implementierungen von beiden equals
und hashCode
oft falsch, weil sie ihre Gleichheits- und Hash-Berechnung ausschließlich auf den Wert der ID
der Entität stützen nur. Bei neu erstellten Instanzen, bei denen die ID
ist ein @GeneratedValue
Ergebnis, das wird nicht funktionieren.
In Ihrem Fall jedes Mal, wenn Sie einen neuen Price
hinzufügen Instanz zu Ihrem Set<>
hinzufügen , derselbe hashCode
Der Wert wird berechnet, weil jede neue Instanz eine ID
von Null hat , sodass sie ständig ersetzt werden.
Passen Sie Ihre equals
an und hashCode
Implementierungen:
@Override
public boolean equals(Object object) {
if ( object == this ) {
return true; // instance equality
}
if ( object == null || object.getClass() != getClass() ) {
return false;
}
final Price other = Price.class.cast( object );
if ( getId() == null && other.getId() == null ) {
// perform equality check against all non-id attributes
}
else {
// perform equality check only on id
}
}
@Override
public int hashCode() {
final HashCodeBuilder hcb = new HashCodeBuilder( 17, 37 );
if ( id == null ) {
hcb.append( price );
hcb.append( discount );
// other fields
}
else {
// only identity basis
hcb.append( id );
}
return hcb.toHashCode();
}
Dadurch wird sichergestellt, dass beim Vergleich zweier nicht persistenter Objekte eines Price
, ihr Vergleich/Hash basiert auf den Nichtidentitätsattributen. Einmal beibehalten, basieren die Methoden ihren Vergleich/Hash nur auf dem Identitätswert, was zwei Fälle zulässt, in denen einer geändert wurde und der andere nicht dem gleichen entsprechen muss.