2011-09-22 14 views
16

क्या हाइबरनेट में हाइबरनेट ऑब्जेक्ट को सहेजते समय गुणों के को अनदेखा करता है?मैं हाइबरनेट को नल मानों को अपडेट करने से कैसे रोक सकता हूं

नोट
मेरे मामले में मैं एक हाइबरनेट Pojo को जैक्सन के माध्यम से डी serializing कर रहा हूँ JSON।

JSON में केवल पोजो के कुछ फ़ील्ड शामिल हैं। यदि मैं पोजो को उन फ़ील्ड को सहेजता हूं जो जेएसओएन में नहीं हैं तो वे पोजो में शून्य हैं और उन्हें हाइबरनेट करते हैं।

मैं updateable=false सेटिंग में आया, लेकिन यह 100% समाधान नहीं है। http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property

हो सकता है कि किसी ने एक और विचार ...

नोट 2 की है:

dynamicUpdateएनोटेशन हाइबरनेट डॉक्स के अनुसार वास्तव में

dynamicInsert/dynamicUpdate (करता है गलत पर डिफ़ॉल्ट):
निर्दिष्ट करता है कि INSERT/UPDAT ई एसक्यूएल रनटाइम पर जेनरेट किया जाना चाहिए और केवल कॉलम हैं जिनके मान शून्य नहीं हैं

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-class

अजीब पर्याप्त अगर आप dynamic-update दस्तावेज के माध्यम से एक्सएमएल में परिभाषित शून्य मूल्यों की hanlding का उल्लेख नहीं है।

गतिशील अद्यतन (वैकल्पिक - गलत पर चूक):
निर्दिष्ट करता है कि UPDATE SQL होना चाहिए> क्रम में उत्पन्न और केवल उन स्तंभों जिनके मान बदल गया है हो सकता है।

तथ्य यह है कि मैं दोनों एनोटेशन और एक्सएमएल विन्यास का उपयोग कर रहा के कारण, हाइबरनेट मेरी dynamicUpdate=true एनोटेशन पर ध्यान नहीं देता रहा है।

+0

आप एसक्यूएल में आ रहा है गुण अद्यतन नहीं किया गया है जो से बचने के लिए गतिशील अद्यतन का उपयोग कर सकते हैं, लेकिन यह आम तौर पर केवल जब सत्व बहुत गुण है (स्तंभों> 50) [संदर्भ इस सेटिंग का उपयोग करने की सलाह दी जाती है: हाइबरनेट 2006 संस्करण के साथ जावा पर्सिस्टेंस]। @ hvgotcodes यह इंगित करने में सही है कि यदि आप कभी भी जारी नहीं रहेंगे तो आपको फ़ील्ड को मानचित्र नहीं करना होगा। – frictionlesspulley

उत्तर

9

आपको पहले डीबी से प्राथमिक कुंजी का उपयोग करके ऑब्जेक्ट लोड करना चाहिए और उसके बाद JSON को कॉपी या deserialize करना चाहिए।

हाइबरनेट के लिए यह पता लगाने का कोई तरीका नहीं है कि मूल्य शून्य के साथ एक संपत्ति स्पष्ट रूप से उस मान पर सेट की गई है या इसे बाहर रखा गया था।

यदि यह एक डालने है तो गतिशील-सम्मिलित = सत्य काम करना चाहिए।

+0

मुझे सही दिशा में ले जाएं। सबसे अच्छा मौजूदा वस्तु को लोड करना और इस ऑब्जेक्ट को तदनुसार अपडेट करना है। जैक्सन के लिए भी एक डिफ़ॉल्ट व्यवहार है http://wiki.fasterxml.com/JacksonFeatureUpdateValue –

+0

मेरे पास मेरे डीबी में कोई शून्य मान नहीं है। तो कोई भी स्पष्ट रूप से कुछ भी शून्य करने के लिए सेट नहीं करेगा। क्या मेरे लिए कोई और समाधान है? @gkamal –

0

मैंने इसके बारे में बहुत कुछ किया है, लेकिन मेरे लिए कोई समाधान नहीं है। इसलिए, मैंने इसे कवर करने के लिए कोई सुखद समाधान नहीं किया।

public void setAccount(Account a) throws HibernateException { 
    try { 
     Account tmp = (Account) session. 
       get(Account.class, a.getAccountId()); 
     tmp.setEmail(getNotNull(a.getEmail(), tmp.getEmail()));    
     ... 
     tmp.setVersion(getNotNull(a.getVersion(), tmp.getVersion())); 
     session.beginTransaction(); 
     session.update(tmp); 
     session.getTransaction().commit(); 
    } catch (HibernateException e) { 
     logger.error(e.toString()); 
     throw e; 
    } 
} 

public static <T> T getNotNull(T a, T b) { 
    return b != null && a != null && !a.equals(b) ? a : b; 
} 

मैं एक Object a जो fields.Those क्षेत्र शायद null की एक बहुत कुछ शामिल प्राप्त करते हैं, लेकिन मैं उन्हें mysql में अद्यतन करने के लिए नहीं करना चाहती। मुझे डीबी से tmp Obejct मिलता है, और getNotNull विधि द्वारा फ़ील्ड को बदलें, फिर ऑब्जेक्ट अपडेट करें।

a Chinese description edition

संबंधित मुद्दे

 संबंधित मुद्दे