2010-12-01 15 views
9

साथ संस्थाओं के लिए बराबर() को लागू करने अगर मैं कॉलम ए, बी, सी, डी
  एक के साथ एक मेज है: स्वत: जनरेट आईडी (पी)
  बी & सी : संयोजन अद्वितीय होना चाहिए
  डी (ये स्तंभ है कि वास्तव में व्यावसायिक समझ में पहचान को परिभाषित कर रहे हैं): कुछ अन्य स्तंभोंसर्वोत्तम तरीका क्या है जब उत्पन्न आईडी

अब, अगर मैं इस तालिका के आधार पर व्यापार वस्तुओं पैदा हो जाएगी (उदाहरण के लिए जावा में), कौन सा बराबर() विधि का बेहतर कार्यान्वयन होगा:

  1. बी और सी

पर आधारित एक

  • परिभाषित समानता पर आधारित समानता परिभाषित या, यह वास्तव में बात नहीं है जो दो की मैं चुन नहीं होगा।

  • उत्तर

    18

    निश्चित रूप से बी और सी, क्योंकि आप equals() अनुबंध को संस्थाओं के बने रहने से पहले वैध होने के लिए चाहते हैं। आप अपने आप को कहते हैं:

    इन स्तंभों है कि वास्तव में व्यावसायिक समझ

    में पहचान को परिभाषित अगर ऐसा है कर रहे हैं, तो उस तर्क equals() का उपयोग करना चाहिए है। डेटाबेस कुंजी डेटाबेस की चिंता है और आपकी व्यावसायिक परत से कोई चिंता नहीं होनी चाहिए।

    और hashcode() में भी वही गुणों का उपयोग करना न भूलें।

    +0

    'बराबर()' विधि में 'ए' को क्यों बाहर निकालें? –

    +3

    एक व्यापार परिप्रेक्ष्य से, एक स्थिर इकाई और समान गुण वाले बी-सी के बराबर एक गैर-स्थिर इकाई बराबर होती है। व्यापार परिप्रेक्ष्य को डीबी आईडी जैसे कार्यान्वयन विवरणों की परवाह नहीं करनी चाहिए, जो केवल मॉडल के लिए प्रासंगिक है। –

    +0

    धन्यवाद। मुझे लगता है कि मैं पीछे की ओर सोच रहा हूं (पहले कार्यान्वयन करना; व्यवसाय की भावना दूसरी)। आपके जवाब ने मुझे एहसास दिलाया। धन्यवाद। –

    2

    यदि (बी, सी) एक अद्वितीय जोड़ी है, तो इसके अतिरिक्त ऑटो-जेनरेट आईडी की आवश्यकता नहीं है। तालिका के लिए, ए (बी, सी) (एक से एक संबंध) के बराबर है।

    आप अतिरिक्त कुंजी चाहते हैं या चाहते हैं, लेकिन मैं सीनाइज़र, उपयोग (बी, सी) के बराबर के लिए सहमत हूं और क्योंकि ए अनावश्यक है (और null ऑब्जेक्ट जारी होने से पहले), इसे बराबर के लिए उपयोग न करें (और हैशकोड)

    +1

    लेकिन हाइबरनेट ने सरोगेट कुंजी की सिफारिश की है, और प्राकृतिक कुंजी को 'प्राकृतिक आईडी' चिह्नित किया जाना चाहिए। –

    3

    मैं @SPFloyd से भी सहमत हूं। लेकिन मैं कुछ और जोड़ना चाहता था।

    ऐसी स्थितियां हैं जब किसी इकाई के पास अद्वितीय व्यावसायिक गुण नहीं होते हैं। उदाहरण के लिए, एक इकाई में केवल A (पीके) और B (एक व्यावसायिक संपत्ति) हो सकती है, लेकिन कई इकाइयों में B मान होता है।

    इस मामले में, equals() और hashcode() बनाना मुश्किल है। आप निश्चित रूप से उन्हें A पर आधार नहीं बनाना चाहते हैं, क्योंकि आप एक ऐसे ऑब्जेक्ट की तुलना करने में सक्षम नहीं होंगे जो अभी तक जारी नहीं है। और तुम अकेले B को उसका आधार नहीं कर सकते, क्योंकि तब कई वस्तुओं है कि विभिन्न अद्वितीय इकाइयों एक ही प्रतीत होता।

    मैं इन स्थितियों में क्या करना एक Date created = new Date(); संपत्ति है। जब कोई इकाई बनाई जाती है, तो यह स्वचालित रूप से एक निर्मित टाइमस्टैम्प प्राप्त करता है। मेरी equals() और hashcode() में मैं B और created दोनों शामिल हैं। यह के रूप में वहाँ एक बहुत ही पतली संभावना है कि दो वस्तुओं एक ही समय (विशेष रूप से एक क्लस्टर समाधान में) पर निर्मित किया जा सकता है, लेकिन यह एक शुरुआत है, सही नहीं है।यदि आपको जरूरी है, तो एक यूआईडी या अन्य जेनरेट की गई व्यावसायिक संपत्ति जोड़ें जो डेटाबेस का पीके नहीं है।

    +0

    क्या बनाया गया क्षेत्र डीबी को मैप करता है या यह सिर्फ एक कृत्रिम (क्षणिक) क्षेत्र है? मैं अपनी डीबी टेबल को प्रदूषित नहीं करना चाहूंगा क्योंकि मैं एक विशिष्ट तकनीक का उपयोग कर रहा हूं, यहां जेपीए। – Kawu

    +1

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

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