2011-01-21 13 views
9

जब व्यापार परत एक नई इकाई है, जो तार्किक रूप से एक मौजूदा इकाई है कि अद्यतन किया जाना चाहिए का एक उदाहरण का प्रतिनिधित्व करता है बनाता है (वे एक ही व्यापार कुंजी का हिस्सा कहते हैं), बुरी आदत विलय करने की यह विधि है?हाइबरनेट/जेपीए सबसे अच्छा अभ्यास में मौजूदा इकाई के साथ एक अलग या नई इकाई विलय सवाल

public User add(User user){ 

    User existingUser = getUserDao().findByBusinessKey(user.getBusinessKey(), false); 
    user.setId(existingUser.getId()); 

    user = getUserDao().merge(user); 

    return user; 
} 

मैं पूछता हूँ क्योंकि अलग इकाई पर स्पष्ट रूप से आईडी की स्थापना मेरे लिए बहुत अजीब लगता है, लेकिन फिर भी बराबरी और hashCode उपयोगकर्ता संस्था की विधि उचित रूप से लागू किया जाता है, आईडी यहां अपनी सेटिंग सुनिश्चित करने के लिए एक ही रास्ता है विलय होता है।

वहाँ एक बेहतर अभ्यास है?

इस पद्धति है कि मुझे बाद में काट होगा वहाँ विशिष्ट कमियां हैं?

एक नज़र डालने के लिए धन्यवाद!

+1

एक बात यह है कि मेरे कोड स्निपेट ने प्रॉपर्टी का प्रदर्शन नहीं किया था, जो यूज़रडाओ() को मूल उपयोगकर्ता संदर्भ में मर्ज (उपयोगकर्ता) का परिणाम दे रहा था ... इसे दिखाने के लिए स्निपेट को अपडेट करना। –

+0

क्यों एक आईडी (स्वत: उत्पन्न) और एक व्यापार कुंजी पहली जगह है? आईडी के रूप में Busines कुंजी का उपयोग क्यों नहीं करें? यह मानता है कि यह कभी भी पाठ्यक्रम में बदलाव नहीं करता .. – bert

+0

यह हमेशा मैंने जो पढ़ा है उससे हाइबरनेट टीम की सिफारिश रही है - और ऐसा लगता है कि मैंने जो कुछ भी देखा है, उसे छोड़कर: यह http: // community.jboss।संगठन/विकी/EqualsandHashCode –

उत्तर

2

कि कोड काम करेगा, लेकिन अलग इकाई पर स्पष्ट रूप से आईडी स्थापित करने के लिए आवश्यक नहीं होना चाहिए।

  1. उपयोगकर्ता एक नया उपयोगकर्ता बनाने के लिए चाहता था, इसलिए ऐप्लिकेशन आईडी के रूप में 'अशक्त' के साथ एक उपयोगकर्ता ऑब्जेक्ट बनाएगी: एक ठेठ हाइबरनेट अनुप्रयोग एक 'सहेजें' विधि है कि दो मामलों को संभालती है।
  2. उपयोगकर्ता उपयोगकर्ताओं की सूची के लिए क्वेरी की है, और संपादन के लिए एक का चयन किया गया है। इस मामले में ऐप एक प्रश्न करता है और ऑब्जेक्ट को 'सेव' विधि पर प्रचारित करता है। ऑब्जेक्ट में एक आईडी होगी और कोड इसके लिए नए मान लागू करेगा।

ऐसा लगता है कि आपके कोड में कुछ सामान्य तरीके से दूसरा मामला नहीं कर रहा है। यदि 'उपयोगकर्ता' ऑब्जेक्ट कुछ पूर्व हाइबरनेट क्वेरी से आता है (उपयोगकर्ता द्वारा 'उपयोगकर्ता को संपादित करें' या उस तरह कुछ क्लिक करके ट्रिगर किया गया है, तो उसके पास पहले से ही एक आईडी होगी। इस प्रकार, केवल merge(user) कॉल की आवश्यकता है।

मैं आमतौर पर कुछ इस तरह करते हैं:

if (user.getId() == null) 
    em.persist(user); 
else 
    user = em.merge(user); 

तब मैं आशावादी ताला मुद्दों (किसी अन्य सत्र ऑब्जेक्ट को अपडेट) और अद्वितीय बाधा मुद्दों को संभालने के लिए कोड जोड़ (दूसरे सत्र में एक ही व्यवसाय कुंजी के साथ कुछ दृढ़ रहना करने की कोशिश की)। इस तरह के सीवन के रूप में

फ़्रेमवर्क इस और भी आसान है क्योंकि वे नियंत्रक सेम तरीकों के बीच हाइबरनेट सत्र का प्रचार कर सकते हैं। तो यहां तक ​​कि 'विलय' की आवश्यकता नहीं है।

+0

क्या यह बिना शर्त के 'विलय' के बराबर है? ऑब्जेक्ट की प्रतिलिपि वापस करने के अलावा, 'विलय' सब कुछ 'जारी' कर सकता है। –

+0

आईआईआरसी, मर्ज जारी रखने का एक सुपरसेट है। सीम का उपयोग शुरू करने के बाद से मैं शायद ही कभी विलय का उपयोग करता हूं। –

0

अपने इकाई एक अलग इकाई केवल एक चीज यू वास्तव में क्या करने की जरूरत entityManager.merge (उपयोगकर्ता) को लागू करने की है है। आपको किसी भी खोजक विधि को निष्पादित करने की आवश्यकता नहीं है। यदि आपकी इकाई अलग नहीं है बल्कि नई है (इसमें आईडी निर्दिष्ट नहीं है) तो आपको उस इकाई पर किसी भी संशोधन ऑपरेशन करने से पहले डेटाबेस में उपयुक्त इकाई मिलनी चाहिए और बाद में इसे मर्ज करना चाहिए। अर्थात:

User user = userDao.findBySomething(Criteria c); 

//stuff that modifies user 

user = userDao.merge(user); 
+0

मुझे लगता है कि मेरी समस्या का दूसरा मामला है जिसका आप उल्लेख करते हैं। जब तक मैं स्पष्ट रूप से इकाई के नए उदाहरण पर आईडी सेट नहीं करता, तो विलय सफल नहीं होता है। यह समझ में आता है कि इकाई प्रबंधक को विलय करने के बारे में एकमात्र तरीका पहचानकर्ता का उपयोग करना है, लेकिन मैंने सोचा था कि इसे समझना था .equals()। यदि नहीं, और मैं आईडी सेट करके जारी रखता हूं, तो क्या मैं किसी अन्य समस्या में भाग जाऊंगा? –

+1

आपके बराबर() और हैशकोड() विधियों को * कभी नहीं मानना ​​चाहिए कि आईडी सेट है, उन्हें हमेशा व्यवसाय कुंजी का उपयोग करना चाहिए। समस्या यह है कि किसी भी तरह से अलग उदाहरण में आईडी नहीं होती है (इसे * क्षणिक * बनाकर, अलग नहीं किया जाता है)। ऊपर मेरा जवाब देखें। –

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