मैं जेपीए को हाइबरनेट (3.2.7) के साथ ओएमएम कार्यान्वयन के रूप में उपयोग कर रहा हूं। मेरे पास एक इकाई संशोधित की जा रही है और फिर विलय हो गई है। मेरे पास इस विशेषता पर कुछ विशेषताएँ सुनिश्चित करने के लिए @EntityListeners भी हैं।जेपीए - हाइबरनेट @ वर्जन गलत तरीके से
यदि मैं मर्ज करने से पहले एक मान बदलता हूं, और फिर उस मूल्य को श्रोता के अंदर @PreUpdate विधि में वापस बदलें, मूल मान सेट करना, इकाई संस्करणों पर मेरा संस्करण बढ़ गया है, लेकिन डेटाबेस संस्करण पर पिछले मान है। मुझे लगता है कि ऑब्जेक्ट के कारण यह नहीं बदला गया है, इसलिए डीबी पर यह अपडेट नहीं किया गया है, लेकिन इकाई पर संस्करण फ्लश के बाद बहाल किए बिना बढ़ाया गया था।
@Entity
@EntityListeners({MyListener.class})
public class MyEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String myValue;
@Version
private Long version ;
}
और इस श्रोता::
public class MyListener {
@PreUpdate
public void preUpdate(MyEntity ua) {
ua.setMyValue("default");
}
}
अब मान लीजिए कि मैं इन मूल्यों के साथ एक वस्तु db पर है: (आईडी = 1, myValue =
बेहतर व्याख्या करने के लिए, मैं इस वस्तु है 'defalut', संस्करण = 1)। मैंने इस ऑब्जेक्ट को पढ़ा है, अलग कर दिया है, इसे क्लाइंट को पास कर दिया है और इसे myValue = 'new' के साथ वापस ले लिया है और मर्ज ऑपरेशन कर रहा है (श्रोता मेरे 'वैल्यू को' डिफ़ॉल्ट 'में बदलता है और इसलिए ऑब्जेक्ट परिणाम डीबी को असम्बद्ध किया जाता है), फ़्लश और लेनदेन से बाहर निकलें (इसलिए प्रतिबद्ध है)। उसके बाद मुझे अपने ऑब्जेक्ट पर संस्करण = 2 मिलता है, लेकिन संस्करण = 1 डीबी पर।
क्या यह एक हाइबरनेट बग है? या एक जेपीए बग?
क्या आप अपने विधि कॉल पदानुक्रम और कॉलिंग अनुक्रम के बारे में उल्लेख कर सकते हैं। हो सकता है कि आपकी विलय विधि अद्यतन विधि से पहले काम कर रही हो। – mbaydar
मुझे लगता है कि हाइबरनेट गंदे चेक झूठी रिटर्न देता है, इसलिए आपकी ऑब्जेक्ट डीबी को स्पर्श नहीं करती है (कोई अपडेट क्वेरी उत्पन्न नहीं होती है), लेकिन पहली बार जब आप एक सेटर कहते हैं तो हाइबरनेट आपके संस्करण फ़ील्ड में वृद्धि कर रहा है। जब भी अद्यतन मूल्य डीबी में लिखा जाता है तो संस्करण फ़ील्ड केवल तभी बढ़ाया जाना चाहिए। यह शायद एक हाइबरनेट बग है। –