Le problème vient de votre hashCode
mise en œuvre sur Price
.
Implémentations des deux equals
et hashCode
souvent erronés car ils basent leur calcul d'égalité et de hachage uniquement sur la valeur de l'ID
de l'entité seulement. Dans le cas d'instances nouvellement créées où l'ID
est une @GeneratedValue
résultat, cela ne fonctionnera pas.
Dans votre cas, chaque fois que vous ajoutez un nouveau Price
instance à votre Set<>
, le même hashCode
la valeur est calculée car chaque nouvelle instance a un ID
nul , donc ils continuent d'être remplacés.
Ajustez votre equals
et hashCode
implémentations :
@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();
}
Cela garantit que lors de la comparaison de deux objets non persistants d'un Price
, leur comparaison/hachage est basé sur les attributs de non-identité. Une fois persistantes, les méthodes baseront leur comparaison/hachage uniquement sur la valeur d'identité, autorisant deux instances où l'une a été modifiée et l'autre n'a pas à être identique.