Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie mogę utrzymać Hashsetu w stanie hibernacji

Problem dotyczy Twojego hashCode wdrożenie na Price .

Implementacje obu equals i hashCode często źle, ponieważ opierają swoją równość i obliczanie skrótu wyłącznie na wartości ID jednostki tylko. W przypadku nowo utworzonych instancji, w których ID to @GeneratedValue wynik, to nie zadziała.

W Twoim przypadku za każdym razem, gdy dodajesz nową Price wystąpienie do Twojego Set<> , ten sam hashCode wartość jest obliczana, ponieważ każda nowa instancja ma null ID , więc są zastępowane.

Dostosuj swoje equals i hashCode implementacje:

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

Daje to pewność, że podczas porównywania dwóch nietrwałych obiektów Price , ich porównanie/hash opiera się na atrybutach niezidentyfikowanych. Po utrwaleniu metody będą opierać swoje porównanie/hash wyłącznie na wartości tożsamości, co pozwala na dwa przypadki, w których jedna została zmodyfikowana, a druga nie musi się równać.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zastosuj kod eksportu JavaScript do kodu PHP, MySql

  2. MySQL otrzymuje brakujące identyfikatory z tabeli

  3. Dynamiczny SQL Pivot (z CONVERT DateField

  4. Pozycja użytkownika MYSQL SELECT (więcej niż x i mniej niż y)

  5. Tablica PDO SHOW TABLES