Il problema è con il tuo hashCode
implementazione su Price
.
Implementazioni di entrambi equals
e hashCode
spesso sbagliano perché basano la loro uguaglianza e il calcolo dell'hash esclusivamente sul valore dell'ID
dell'entità solo. Nei casi di nuove istanze in cui il ID
è un @GeneratedValue
risultato, questo non funzionerà.
Nel tuo caso, ogni volta che aggiungi un nuovo Price
istanza al tuo Set<>
, lo stesso hashCode
value viene calcolato perché ogni nuova istanza ha un ID
nullo , quindi continuano a essere sostituiti.
Modifica il tuo equals
e hashCode
implementazioni:
@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();
}
Questo assicura che quando si confrontano due oggetti non persistenti di un Price
, il loro confronto/hash si basa sugli attributi non di identità. Una volta resi persistenti, i metodi baseranno il loro confronto/hash solo sul valore di identità, consentendo due istanze in cui una è stata modificata e l'altra non deve corrispondere allo stesso.