Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible de conserver un Hashset en veille prolongée

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.