मेरे पास एक जेपीए प्रोग्राम है जहां EclipseLink Persistence प्रदाता है। जब मैं किसी उपयोगकर्ता इकाई को विलय करता हूं, उसकी आईडी बदलता हूं, और उसी उपयोगकर्ता उदाहरण को फिर से मर्ज करने का प्रयास करता हूं, तो एक त्रुटि फेंक दी जाती है। मैं अपनी समस्या को सबसे सरल तरीके से चित्रित करने के लिए अपने कोड को फिर से लिखता हूं।किसी इकाई को मर्ज करें, उसकी आईडी बदलें, फिर से विलय करें, "डेटाबेस में प्राथमिक कुंजी कॉलम में मैप किया गया है। अपडेट्स की अनुमति नहीं है" त्रुटि
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
user.setId(2);
userManager.merge(user);
उपरोक्त कोड लेनदेन संदर्भ में नहीं है। userManager एक EntessManager इंजेक्शन के साथ एक स्टेटलेस सत्र बीन है। निष्पादित होने पर, कंसोल प्रिंट करता है:
User is managed? false
Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [demo.model.User] is mapped to a primary key column in the database. Updates are not allowed.
अपवाद दूसरे विलय() आमंत्रण पर होता है।
अगर मैं एक नया उपयोगकर्ता बनाने, अपने आईडी सेट करता है और विलय यह, यह काम करता है:
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
User newUser = new User();
newUser.setId(2);
userManager.merge(newUser);
तो पहले परिदृश्य और दूसरा एक के बीच अंतर क्या है? जेपीए विनिर्देश के अनुसार, जब तक कि इकाई अलग राज्य में है, विलय सफल होना चाहिए, है ना? (आईडी = 2 के साथ इकाई को मानना)
क्यों EclipseLink प्रदाता को इस तथ्य से परेशान होना प्रतीत होता है कि उपयोगकर्ता इकाई को पहले विलय कर दिया गया है?
अद्यतन: यह ग्रहण लिंक का एक बग प्रतीत होता है। मैं जगह ले ली है EclipseLink से हठ प्रदाता हाइबरनेट करने के लिए:
मैं
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
बदलने
<provider>org.hibernate.ejb.HibernatePersistence</provider>
कोई त्रुटि निकाल दिया गया है करने के लिए।
अपने आईडी एक उत्पन्न मूल्य है? – kostja
हां, यह एक उत्पन्न मूल्य –