2010-11-29 13 views
12

किसी कारण से जब मेरी सभी इकाइयों पर आलसी = सच है, तो बराबर() विधि सही ढंग से काम नहीं करती है जब एक तरफ आलसी लोड वाली इकाई होती है और दूसरी तरफ एक सामान्य इकाई होती है। यहां एक उदाहरण दिया गया है:जब आप आलसी = सत्य करते हैं तो हाइबरनेट इकाइयों के साथ काम करने के बराबर कैसे होते हैं?

if(activeTask.getTask().equals(task)) {...} 

इस मामले में, सक्रिय टास्क का कार्य प्रॉक्सी होगा जबकि दाएं तरफ एक नियमित होगा। बराबर() असफल हो जाएगा। इस समस्या को ठीक करने के लिए, मैं अक्सर इस तरह की चीजें करता हूं:

if(activeTask.getTask().getId() == task.getId()) {...} 

यह काम करता है, लेकिन यह आदर्श नहीं है। मैं अपने बराबर() विधि का उपयोग करना चाहूंगा।

क्या किसी के पास इस समस्या का कोई अच्छा समाधान है? यह वास्तव में इस तरह की चीजों के बारे में सोचने के लिए एप्लिकेशन के शोर के स्तर में जोड़ता है।

यदि मैं आलसी = झूठा कहता हूं, तो मुझे प्रॉक्सी से निपटने की ज़रूरत नहीं है, और इसलिए बराबर() काम करेगा। लेकिन इसका प्रदर्शन पर बहुत नकारात्मक प्रभाव पड़ता है।

यह कहना अच्छा नहीं है, "जब आप प्रॉक्सी का उपयोग करते हैं तो सभी मामलों में बराबर() काम करता है ... फिर बराबर() विश्वसनीय नहीं है।"

उत्तर

2

मैंने निबर्ननेट के लिए एक समान प्रश्न दर्ज किया है। हो सकता है कि यहां दिए गए उत्तरों भी इस प्रश्न के लिए उपयोगी होंगे: lazy-loaded nhibernate properties in equals and gethashcode

8

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन यह अभी भी अनुत्तरित है और लोग इस पर ठोकर खा सकते हैं।

मुझे कुछ दिन पहले भी यही समस्या थी। परियोजना में हम एक सार आधार वर्ग BasicEntityType, जो सिर्फ एक आईडी है और बराबर कहा आधार वर्ग में कार्यान्वित किया जाता का उपयोग करें:

@Override 
public final boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 

    if (obj == null) { 
     return false; 
    } 

    Class<?> objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj); 
    if (this.getClass() != objClass) { 
     return false; 
    } 

    if (id == null) { 
     return false; 
    } 

    return id.equals(((BasicEntityType) obj).getId()); 
} 

इस कोड में दो महत्वपूर्ण भागों हैं:

  • पहले: Do कक्षा समानता के लिए सीधे जांच न करें, यह दिए गए ऑब्जेक्ट के साथ काम नहीं कर सकता है।
  • दूसरा: दिए गए ऑब्जेक्ट के सभी गुणों का उपयोग विधियों का उपयोग करके किया जाना चाहिए। या आप वास्तविक वस्तु को खोल सकते हैं।
+0

भयानक कामकाज –

+0

आपको हाइबरनेट का उपयोग करते समय बराबर और हैशकोड में डेटाबेस आईडी का उपयोग नहीं करना चाहिए। Http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html#persistent-classes-equalshashcode –

+0

HibernateProxyHelper.getClassWithoutInitializingProxy (obj) विरासत के साथ काम नहीं करता है क्योंकि देखें यह org.hibernate.proxy.LazyInitializer.getImplementation() के बजाय org.hibernate.proxy.LazyInitializer.getPersistentClass() पर कॉल करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे