Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

हाइबरनेट में एक हैशसेट जारी नहीं रख सकता

समस्या आपके hashCode . के साथ है Price . पर क्रियान्वयन ।

दोनों का कार्यान्वयन equals और hashCode अक्सर गलत होते हैं क्योंकि वे अपनी समानता और हैश गणना को पूरी तरह से इकाई के ID . के मान पर आधारित करते हैं केवल। नव निर्मित उदाहरणों के मामलों में जहां ID एक @GeneratedValue है परिणाम, यह काम नहीं करेगा।

आपके मामले में, हर बार जब आप एक नया Price जोड़ते हैं आपके Set<> . पर उदाहरण , वही hashCode मान की गणना की जाती है क्योंकि प्रत्येक नए उदाहरण में एक शून्य ID होता है , इसलिए वे बदले जाते रहते हैं।

अपना equals एडजस्ट करें और hashCode कार्यान्वयन:

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

यह सुनिश्चित करता है कि Price . की दो गैर-स्थिर वस्तुओं की तुलना करते समय , उनकी तुलना/हैश गैर-पहचान विशेषताओं पर आधारित है। एक बार जारी रहने के बाद, विधियां उनकी तुलना/हैश को केवल पहचान मूल्य के आधार पर आधार बनाएगी, जिससे दो उदाहरणों की अनुमति मिलती है जहां एक को संशोधित किया गया है और दूसरे को समान नहीं करना है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. हैश MySQL डेटाबेस स्कीमा

  2. MySQL पर सिम्युलेटिंग लैग फंक्शन

  3. उन पंक्तियों का चयन करें जहां पिवट में सभी आईडी हैं

  4. Wordpress उपयोगकर्ता और उपयोगकर्तामेटा - एक तालिका में एक से अधिक पंक्तियों को दूसरी तालिका में एक पंक्ति में जोड़ना

  5. SQLSTATE [HY000] [1698] उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' के लिए प्रवेश निषेध