संग्रह और हाइबरनेट के साथ काम करना

मुझे एक समस्या मिली, जहां मैं हैश मैप से मूल्य प्राप्त नहीं कर सकता लेकिन मुझे यकीन है कि जिस कुंजी को मैं मूल्य प्राप्त करना चाहता हूं, वह मानचित्र में है (लेकिन एक ही उदाहरण नहीं)। तो यहां है, मेरे पास क्या है: मुझे एक हैबरकी, और एक हाइबरवेल मिला।

public class HiberKey {
    private int id;
}

public class HiberVal {
  private int id;
}

And while the programm is running, it does a transaction now and then, and at some point i got a Hashmap AND a single HiberKey single_key. The problem here is, that i wanted to execute map.get(single_key) i allways get a null value, but im shure, there is the same value in the map (not same reference, but also of an transaction from the hibernate-session). The first thing i thought of was equals & hashcode, but those methodes are already implemented in HiberKey.

एक समाधान हैइबरकी के बजाय key.id के साथ नक्शा भरना होगा और map.get (single_key.id) को कॉल करना होगा, लेकिन मुझे लगता है कि हाइबरनेट का विचार नहीं है, और मुझे नक्शे में हैशमैप्स के साथ और अधिक जटिल संरचनाएं मिलीं और इसी तरह , और अगर मैं उन सभी को पूर्णांक से भरता हूं, तो यह वास्तव में आसान और पठनीय नहीं है

क्या किसी के पास कोई सुझाव है, यह क्यों हो सकता है? किसी भी सलाह के लिए धन्यवाद।

हाइबरनेटवर्जन: 3.5.3

@Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (!(obj instanceof BabelKey)) {
      return false;
    }
    return ((BabelKey) obj).id == id;
  }

  @Override
  public int hashCode() {
    return String.valueOf(id).hashCode();
  }

//अद्यतन:

ठीक है, यहां एक उदाहरण है जहां मैं अतिरिक्त out.println डीबगिंग के साथ मानचित्र को फिर से चालू करता हूं, और आउटपुट में आप देख सकते हैं कि कुंजी मानचित्र में है, लेकिन बस काम नहीं करती है। उत्पादन:

--------------------------
Following keys in Map:
Keys with no null value: 301 //Key is In Map
Keys with no null value: 304
Keys with no null value: 303
Keys with no null value: 307
Searched key: 301 //same key
Result: null //result is null
Next Try: null

//UPDATE2:

मैंने दो प्रमुख फाइलों की तुलना की, और बराबर रिटर्न बराबर है, और उनके पास एक ही हैशकोड भी है। लेकिन किसी भी तरह हाइबरनेट जावासाइस्ट का उपयोग करता है, इसलिए अलग-अलग उदाहरण हैंश मैप के साथ काम नहीं करेंगे। मुझे लगता है कि इसके लिए एकमात्र समाधान हैशैप में आईडी को सहेजना और उनकी आईडी की तुलना करना है।

0
हां यही मैं कहना चाहता था। मुझे खेद है कि मैं कंपनी कानून के कारण पूर्ण कोड प्रदान नहीं कर सकता :(
जोड़ा लेखक manman, स्रोत
मैं जो कह रहा हूं उसका पालन करने की कोशिश कर रहा हूं, लेकिन यह थोड़ा मुश्किल है। क्या आप कह रहे हैं कि आप किसी ऑब्जेक्ट का उपयोग हैश मैप के भीतर कुंजी के रूप में कर रहे हैं, लेकिन जब आप हैश मैप से एक मान को पुनर्प्राप्त करने का प्रयास करते हैं जो हैश मैप में मौजूदा कुंजियों में से एक के बराबर होना चाहिए, तो यह शून्य हो जाता है? क्या हम उन संस्थाओं की पूरी तरह से देख सकते हैं जिनका आप उपयोग कर रहे हैं और वह कोड जो हैश मैप का संदर्भ देता है?
जोड़ा लेखक Joe, स्रोत
क्या आप कुंजी के नए उदाहरणों को तत्काल बना रहे हैं जब आप उन्हें हैश मैप में जोड़ते हैं? क्या मैं वह कोड देख सकता हूं जिसके साथ आप अपना परीक्षण चला रहे हैं?
जोड़ा लेखक Joe, स्रोत

1 उत्तर

किसी ऑब्जेक्ट को हैश मैप की कुंजी के रूप में सही तरीके से उपयोग करने के लिए, आपको हैशकोड() और बराबर() विधियों को काम करने के लिए ठीक से ओवरराइड करना होगा। आपको यह गारंटी देनी होगी कि वे विधियां उसी ऑब्जेक्ट के अलग-अलग उदाहरणों के साथ समान परिणाम देगी जिसमें समान डेटा शामिल है ताकि इसे ठीक से काम किया जा सके।

आपको यह भी सत्यापित करना होगा कि जिस वस्तु का आप कुंजी के रूप में उपयोग कर रहे हैं वह किसी भी तरह से नहीं बदलता है जो हैशकोड() विधि हैश मैप से पुनर्प्राप्त करने से पहले अलग-अलग परिणाम देगा।

मैं अनुशंसा करता हूं कि आप जिस वस्तु को कुंजी के रूप में उपयोग कर रहे हैं वह अपरिवर्तनीय हो।

संपादित करें: मैं एक लिंक जोड़ रहा हूं जो किसी ऑब्जेक्ट को कुंजी के रूप में उपयोग करते समय आपके द्वारा किए जा सकने वाले मुद्दों की समस्याओं और समाधानों को बताता है। यह बहुत है। मेरा सुझाव है कि आप इस लेख के माध्यम से चलते हैं।

http://www.artima.com/lejava/articles/equality.html

0
जोड़ा
बराबर और हैकोड पहले से ही लागू किया गया था। (कार्यान्वयन प्रश्न में जोड़ा गया)
जोड़ा लेखक manman, स्रोत
क्या हैश मैप हैशकोड() को कॉल नहीं करता है लेकिन हैशैप विशिष्ट हैशथोड कहता है?
जोड़ा लेखक manman, स्रोत
मैंने बराबर और हैशकोड के कंसोलआउट के साथ दो प्रमुख ऑब्जेक्ट्स की तुलना की, और यह मुझे सच और एक ही हैशकोड देता है। लेकिन इस समस्या का उत्तर है: कोई समाधान नहीं है। हाइबरनेट जैवसिस्ट का उपयोग करता है, जो आपके जावा कक्षाओं में हेरफेर करता है और आपके हैशकोड में हेरफेर करता है और मेथोड के बराबर होता है। समस्या यह है कि मेरे पास एक ही वस्तु के दो अलग-अलग उदाहरण हैं। काम नहीं करता है
जोड़ा लेखक manman, स्रोत
हाइबरनेट काम करने का तरीका नहीं है। यह जावासिस्ट का उपयोग कर सकता है, लेकिन यह कभी भी ऐसी कोर कार्यक्षमता को कम नहीं करता है। हमें और कोड चाहिए - क्या आप: अपनी इकाई और कुंजी दोनों वर्गों की प्रतिलिपि लें, उन्हें कुछ ब्लेंड में नाम दें, फिर कुंजी और आईडी गुणों और बराबर और हैशकोड विधियों को छोड़कर सबकुछ हटा दें। उसे कंपनी कानून को संतुष्ट करना चाहिए, और हमें काम करने के लिए पर्याप्त देना चाहिए।
जोड़ा लेखक racraman, स्रोत
यदि आप आईडी के रूप में एक प्राचीन int का उपयोग कर रहे हैं, तो क्यों हैश आईडी() के लिए आईडी वापस न करें?
जोड़ा लेखक Joe, स्रोत
नहीं, यह बराबर() तब हैशकोड() को कॉल करता है। आईडी फ़ील्ड को अंतिम बनाएं और देखें कि क्या इससे मदद मिलती है। यह मूल्य को संभवतः बदलने से रोक देगा।
जोड़ा लेखक Joe, स्रोत