आशावादी एक इकाई के लिए संस्करण विशेषता का उपयोग कर ताला ठीक काम करता है और लागू करने के लिए आसान है:फ्रंट एंड पर हाइबरनेट ऑप्टिस्टिक लॉकिंग संस्करण प्रॉपर्टी का उपयोग कैसे करें?
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) का उपयोग करके सेट किया गया है। मुझे उम्मीद है कि यह काम करता है, लेकिन यह कुशल प्रतीत नहीं होता है।
मैं केवल सत्र कैश के बजाय, उदाहरण पर संस्करण प्रॉपर्टी की जांच करने के लिए हाइबरनेट से पूछना चाहता हूं।
उत्तर के लिए अग्रिम धन्यवाद!
- लेस
सत्र कार्यों से इकाई को बेदखल कर रहा है। :) यह देखने के लिए खुला छोड़ रहा है कि मेरे अंतर्दृष्टिपूर्ण उत्तर हैं ... – les2