sql >> Database >  >> RDS >> Mysql

Kan een hashset niet in de slaapstand houden

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.



  1. Datums reserveringssysteem

  2. Bereik van TWEE Looping TextFields, mogelijk?

  3. JPA TemporalType.Date geeft verkeerde datum op

  4. Mysql Concat twee kolommen tijdens het zoeken met LIKE