Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile mantenere un hashset in ibernazione

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.