2009-09-14 19 views
12

आशावादी एक इकाई के लिए संस्करण विशेषता का उपयोग कर ताला ठीक काम करता है और लागू करने के लिए आसान है:फ्रंट एंड पर हाइबरनेट ऑप्टिस्टिक लॉकिंग संस्करण प्रॉपर्टी का उपयोग कैसे करें?

private int VERSION; 
public int getVERSION() { return VERSION; } 
public void setVERSION(int VERSION) { this.VERSION = VERSION; } 

अब तक तो अच्छा:

<version property="VERSION" type="int" column="EX_VERSION" /> 

इकाई निम्न प्रकार की संपत्ति है। अब सेवा विधियां ऊपर की इकाई के लिए डेटा ट्रांसफर ऑब्जेक्ट (डीटीओ) लौटाती हैं, जो दृश्य HTML में प्रदर्शित होते हैं। अद्यतन पृष्ठों के लिए, संस्करण विशेषता एक HTML छिपे हुए फ़ील्ड में संग्रहीत है और फ़ॉर्म के साथ सबमिट की गई है।

यह सुनिश्चित करने के लिए संस्करण संपत्ति का उपयोग करना है कि उपयोगकर्ता की अद्यतन विफल हो जाएगी यदि प्रदर्शित की गई जानकारी पुराने संस्करण के साथ है।

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

public void update(SimpleDTO dto) { 
    SimplyEntity entity = getSimpleDao().load(dto.getId()); 
    copyProperties(dto, entity); // all properties, including VERSION copied to entity 
    getSimpleDao().update(entity); 
} 

समस्या यह है कि संस्करण संपत्ति copyProperties द्वारा इकाई में नकल (...) हाइबरनेट द्वारा सम्मानित नहीं है। मैंने निम्नलिखित फोरम में कारण को ट्रैक किया: https://forum.hibernate.org/viewtopic.php?f=1&t=955893&p=2418068

संक्षेप में, जब लोड() कहा जाता है, हाइबरनेट सत्र कैश में संस्करण गुण को कैश करता है और इससे कोई फर्क नहीं पड़ता कि इसके मूल्य को बाद में बदल दिया गया है। मैं मानता हूं कि यह सही व्यवहार है, लेकिन मुझे बॉस द्वारा एचटीएमएल फॉर्म प्रॉपर्टी के माध्यम से संस्करण पारित करने का निर्देश दिया गया है (यदि इसके लिए एक बेहतर पैटर्न है, तो मुझे यह सुनना अच्छा लगेगा)।

एक समाधान जो मैं अब खोज रहा हूं, यह है कि संस्करण के बाद सत्र को इकाई को बेदखल करना है, इसके बाद अद्यतन को होने से पहले hibernateTemplate.evict (simpleEntity) का उपयोग करके सेट किया गया है। मुझे उम्मीद है कि यह काम करता है, लेकिन यह कुशल प्रतीत नहीं होता है।

मैं केवल सत्र कैश के बजाय, उदाहरण पर संस्करण प्रॉपर्टी की जांच करने के लिए हाइबरनेट से पूछना चाहता हूं।

उत्तर के लिए अग्रिम धन्यवाद!

- लेस

+3

सत्र कार्यों से इकाई को बेदखल कर रहा है। :) यह देखने के लिए खुला छोड़ रहा है कि मेरे अंतर्दृष्टिपूर्ण उत्तर हैं ... – les2

उत्तर

10

आप वास्तव में डीटीओ का उपयोग करने की जरूरत है? यदि आप वास्तविक इकाई को पार कर रहे थे तो आपको यह समस्या नहीं होगी - न ही आपको इकाई को फिर से लोड करना होगा, जो प्रदर्शन के लिए बिल्कुल सही नहीं है।

लेकिन यदि आपके पास डीटीओ का उपयोग करने का वैध कारण है, तो भी मैं समझ नहीं पा रहा हूं कि आप अपने पर संस्करण संख्या को ताज़ा रूप से पुनः लोड करने से पहले इकाई को अपडेट करने का प्रयास क्यों करेंगे। अपने कार्यप्रवाह में विभिन्न परिदृश्यों संभव पर विचार करें:

  1. इकाई शुरू में भरी हुई है, संस्करण है = V1
  2. यह डीटीओ जो यूआई को जाता है को स्थानांतरित करने का वापस आता है और बचाया जा करने के लिए तैयार है।
  3. इकाई फिर से भरी हुई है, संस्करण है = V2

अब आप दो संभावनाएं हैं:

  1. V1 == V2। Peachy, आपको कुछ भी करने की ज़रूरत नहीं है।
  2. वी 1 वी 2 से कम है, जिसका अर्थ यह है कि जब आप इसे संपादित कर रहे थे तो इकाई किसी और द्वारा अपडेट की गई थी। संस्करण को V1 पर सेट करने का प्रयास करने का कोई कारण नहीं है और सहेजने का प्रयास करें क्योंकि बचत विफल हो जाएगी। आप या तो इसे V2 से बचा सकते हैं (इस प्रकार किसी और के परिवर्तन को ओवरराइड कर सकते हैं) या अब असफल हो सकते हैं। (हाइबरनेट को शामिल किए बिना)।
+1

1. रीलोडिंग आवश्यक हो सकती है, क्योंकि डीटीओ पूरी तरह से सभी इकाई फ़ील्ड, बस एक सबसेट नहीं रख सकता है। 2. टिप्पणी के रूप में (और https://forum.hibernate.org/viewtopic.php?t=977889a के नीचे लिंक पर भी पढ़ सकते हैं), बेदखल यहां मदद कर सकता है। – ron