Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cant duy trì một Hashset ở chế độ ngủ đông

Vấn đề là với hashCode của bạn triển khai trên Price .

Việc triển khai cả hai equalshashCode thường sai vì chúng chỉ dựa trên bình đẳng và tính toán băm dựa trên giá trị của ID của thực thể chỉ còn. Trong các trường hợp mới được tạo mà ID là một @GeneratedValue kết quả là điều này sẽ không hoạt động.

Trong trường hợp của bạn, mỗi khi bạn thêm một Price mới ví dụ cho Set<> của bạn , cùng một hashCode giá trị được tính toán vì mỗi phiên bản mới có ID rỗng , vì vậy chúng tiếp tục được thay thế.

Điều chỉnh equals của bạn và hashCode triển khai:

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

Điều này đảm bảo rằng khi so sánh hai đối tượng không tồn tại của một Price , so sánh / băm của chúng dựa trên các thuộc tính không phải danh tính. Sau khi được duy trì, các phương thức sẽ chỉ so sánh / băm dựa trên giá trị nhận dạng của chúng, cho phép hai trường hợp trong đó một cái đã được sửa đổi và cái kia không tương đương với cùng một giá trị.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đồng bộ hóa cơ sở dữ liệu máy khách SQLite với cơ sở dữ liệu máy chủ MySQL

  2. MINUTE () Ví dụ - MySQL

  3. Làm việc với các công cụ cơ sở dữ liệu MySQL

  4. Giao diện cơ sở dữ liệu GUI MySQL

  5. các cột bổ sung mysql có cùng tên từ hai bảng