Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ein Hashset nicht im Ruhezustand beibehalten

Das Problem liegt bei Ihrem hashCode Implementierung auf Price .

Implementierungen von beiden equals und hashCode oft falsch, weil sie ihre Gleichheits- und Hash-Berechnung ausschließlich auf den Wert der ID der Entität stützen nur. Bei neu erstellten Instanzen, bei denen die ID ist ein @GeneratedValue Ergebnis, das wird nicht funktionieren.

In Ihrem Fall jedes Mal, wenn Sie einen neuen Price hinzufügen Instanz zu Ihrem Set<> hinzufügen , derselbe hashCode Der Wert wird berechnet, weil jede neue Instanz eine ID von Null hat , sodass sie ständig ersetzt werden.

Passen Sie Ihre equals an und hashCode Implementierungen:

@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();
}

Dadurch wird sichergestellt, dass beim Vergleich zweier nicht persistenter Objekte eines Price , ihr Vergleich/Hash basiert auf den Nichtidentitätsattributen. Einmal beibehalten, basieren die Methoden ihren Vergleich/Hash nur auf dem Identitätswert, was zwei Fälle zulässt, in denen einer geändert wurde und der andere nicht dem gleichen entsprechen muss.