का उपयोग करते समय OptimisticLockException मेरे पास एक बाकी एप्लिकेशन है जहां संसाधनों में से एक को अपडेट किया जा सकता है। (आशावादी लॉकिंग के लिए इस्तेमाल किया) प्राप्त करता है आईडी और नई वस्तु स्टोर जो PUT अनुरोध इकाई deserializing द्वारा बनवाया गया था, संस्करण सेट:जेपीए मर्ज()
updateWithRelatedEntities (स्ट्रिंग, स्टोर): नीचे दो तरीकों इस कार्य को प्राप्त करने के लिए जिम्मेदार हैं नए ऑब्जेक्ट पर और लेनदेन में कॉल अपडेट करें।
public Store updateWithRelatedEntities(String id, Store newStore) { Store existingStore = this.get(id); newStore.setVersion(existingStore.getVersion()); em.getTransaction().begin(); newStore = super.update(id, newStore); em.getTransaction().commit(); return newStore; }
अद्यतन (स्ट्रिंग, टी): एक अद्यतन बनाने के लिए एक सामान्य विधि। जांचता है कि आईडी मेल खाते हैं और मर्ज ऑपरेशन करते हैं।
T obj = em.find(type, id);
डेटाबेस में दुकान वस्तु का एक अद्यतन जिसका अर्थ है कि हम OptimisticLockException जबmerge
ट्रिगर (क्योंकि संस्करणों अब अलग हैं) मिल चलाता है:public T update(String id, T newObj) { if (newObj == null) { throw new EmptyPayloadException(type.getSimpleName()); } Type superclass = getClass().getGenericSuperclass(); if (superclass instanceof Class) { superclass = ((Class) superclass).getGenericSuperclass(); } Class<T> type = (Class<T>) (((ParameterizedType) superclass).getActualTypeArguments()[0]); T obj = em.find(type, id); if (!newObj.getId().equals(obj.getId())) { throw new IdMismatchException(id, newObj.getId()); } return em.merge(newObj); }
समस्या यह है कि इस कॉल है।
ऐसा क्यों हो रहा है? इसे हासिल करने का सही तरीका क्या होगा? जो होता है, मुझे लगता है, आशावादी लॉक समस्या का समाधान -
मैं एक तरह से existingStore
को newStore
से गुण कॉपी और मर्ज के लिए existingStore
उपयोग करने के लिए नहीं करना चाहती।
यह कोड किसी एप्लिकेशन सर्वर पर नहीं चल रहा है और मैं जेटीए का उपयोग नहीं कर रहा हूं।
संपादित: अगर मैं अद्यतन कॉल करने से पहले existingStore अलग, T obj = em.find(type, id);
इसलिए इस समस्या का हल दुकान वस्तु के अपडेट ट्रिगर नहीं है। प्रश्न अभी भी बनी हुई है - जब इकाई अलग नहीं होती है तो यह क्यों ट्रिगर करता है?
क्या आप आशावादी लॉकिंग की अवधारणा को समझते हैं? – Kayaman
हां, मैं अवधारणा को समझता हूं और मुझे यह त्रुटि क्यों मिल रही है। जो मुझे समझ में नहीं आता है, यही कारण है कि जेपीए (आईडी) को कॉल करते समय संस्करण अपडेट करता है जो मर्ज कॉल करते समय OptimistiLockException में जाता है। –
'get (id)' जैसा दिखता है? – Kayaman