Het probleem ligt bij uw hashCode
implementatie op Price
.
Implementaties van beide equals
en hashCode
vaak verkeerd omdat ze hun gelijkheid en hash-berekening uitsluitend baseren op de waarde van de ID
van de entiteit enkel en alleen. In gevallen van nieuw aangemaakte gevallen waarin de ID
is een @GeneratedValue
resultaat, dit zal niet werken.
In jouw geval, elke keer dat je een nieuwe Price
toevoegt instantie naar uw Set<>
, dezelfde hashCode
waarde wordt berekend omdat elke nieuwe instantie een null ID
. heeft , dus ze worden steeds vervangen.
Pas je equals
en hashCode
implementaties:
@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();
}
Dit zorgt ervoor dat bij het vergelijken van twee niet-persistente objecten van een Price
, is hun vergelijking/hash gebaseerd op de niet-identiteitskenmerken. Eenmaal volgehouden, zullen de methoden hun vergelijking/hash baseren op alleen de identiteitswaarde, waardoor twee gevallen mogelijk zijn waarbij de ene is gewijzigd en de andere niet hetzelfde hoeft te zijn.