2010-01-18 26 views
11

मैं सोच रहा था कि जावा पर एचबी का उपयोग करके एक पृथक ऑब्जेक्ट के कुछ फ़ील्ड को अपडेट करने का सबसे अच्छा तरीका क्या है। विशेष रूप से जब ऑब्जेक्ट में बच्चे ऑब्जेक्ट गुण होते हैं। उदाहरण के लिए (एनोटेशन हटा दिया और संख्या शोर को कम करने के लिए कम क्षेत्र):हाइबरनेट पर एक अलग ऑब्जेक्ट के कुछ फ़ील्ड को अपडेट करने का सबसे अच्छा तरीका?

public class Parent { 
    int id; 
    String field2; 
    ... 
    Child child; 
} 

public class Child { 
    int id; 
    String field3; 
} 

एक MVC webapp मैं Session.get (Parent.class, 123) का उपयोग कर एक माता पिता के उदाहरण के लिए कह सकते हैं में एक जनक अपडेट करते समय, एक फॉर्म को पॉप्युलेट करने और इसे प्रदर्शित करने के लिए इसका इस्तेमाल करें। कोई डीटीओ नहीं, सिर्फ विचलित माता-पिता को देखने के लिए पास किया जाता है और एक रूप से बांध दिया जाता है। अब, मैं केवल उपयोगकर्ता को फ़ील्ड 2 अभिभावक की विशेषता को अद्यतन करने की अनुमति देना चाहता हूं। तो जब उपयोगकर्ता फॉर्म पोस्ट करता है तो मुझे आईडी और फ़ील्ड 2 भरने के साथ एक अभिभावक उदाहरण मिलता है (मुझे लगता है कि एमवीसी फ्रेमवर्क यहां कोई फर्क नहीं पड़ता है, बाध्यकारी होने पर सभी अधिकतर व्यवहार करते हैं)।
अब, इकाई का अद्यतन करने के लिए कौन सी रणनीति सर्वोत्तम है? मैं कुछ विकल्प में सोच सकते हैं, लेकिन मैं फिर से सत्र से अभिभावकीय उदाहरण पुनर्प्राप्त विशेषज्ञों :) (याद रखें कि मैं माता-पिता और बच्चे के उदाहरणों के बीच संबंधों को ढीला करने के लिए चाहते हैं)

ए) सुनना चाहते हैं और हाथ से प्रतिस्थापित करें

Parent pojoParent; //binded with the data of the Form. 
Parent entity = Session.get(Parent.class,pojoParent.getId()); 
entity.setField2(pojoParent.getField2()).   

मैं इसका बहुत उपयोग कर रहा हूं। लेकिन pojoParent एक अंडरवर्कर डीटीओ के रूप में इस्तेमाल किया प्रतीत होता है। अगर यह अद्यतन करने के लिए फ़ील्ड की संख्या बड़ी हो जाती है तो यह भी भयानक हो जाता है।

बी) बच्चे को कहीं भी स्टोर करें (httpSession?) और बाद में इसे संबद्ध करें।

Parent parent = Session.get(Parent.class,123); 
//bind the retrieved parent to the form 
// store the Child from parent.getChild() on the httpSession 
... 
//when the users submits the form... 
pojoParent.setChild(someHttpSessionContext.getAttribute('Child')) 
Session.save(pojoParent); 

मुझे लगता है कि यह बकवास है, लेकिन मैं कुछ परियोजनाओं में यह देखा ...

सी) जनक और inmutable के रूप में बाल के बीच संबंध सेट करें। रिश्ते पर अद्यतन करने योग्य = झूठी का उपयोग करके मैं बच्चे को खोने के बारे में चिंता किए बिना किसी भी मूल क्षेत्र को अपडेट कर सकता हूं। वैसे भी, यह काफी प्रतिबंधित है और रिश्ते को कभी अपडेट नहीं किया जाएगा।

तो, आपको इस स्थिति को हल करने का सबसे अच्छा तरीका क्या है?

अग्रिम धन्यवाद!

उत्तर

10

एक जनक वस्तु लोड करने के बाद, आप ने कहा

अब, मैं केवल उपयोगकर्ता माता पिता की field2 विशेषता को अपडेट करने

उपयोग मामले के आधार पर, आप एक का उपयोग कर सकते अनुमति देना चाहते हैं UpdateableParent

public class UpdateableParent { 

    private String field2; 

    // getter's and setter's 

} 

अब आपत्ति हमारे जनक भंडार

@Repository 
public class ParentRepositoryImpl implements ParentRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 


    public void updateSpecificUseCase(UpdateableParent updateableParentObject) { 

     Parent parent = sessionFactory.getCurrentSession().load(Parent.class, updateableParentObject.getId()); 

     try { 
      // jakarta commons takes care of copying Updateable Parent object to Parent object 

      BeanUtils.copyProperties(parent, updateableParentObject); 
     } catch (Exception e) { 
      throw new IllegalStateException("Error occured when updating a Parent object", e); 
     } 

    } 

} 

इसके फायदे

  • यह सुरक्षित है: आप सिर्फ तुम क्या वास्तव में चाहते हैं
  • आप MVC ढांचे के बारे में चिंता की जरूरत नहीं है अद्यतन (कुछ MVC ढांचे आप एक allowedFields प्रॉपर्टी सेट अप करने की अनुमति देता है)। क्या होता है यदि आप कुछ अनुमत फ़ील्ड भूल जाते हैं ???

यद्यपि यह एक प्रौद्योगिकी से संबंधित सवाल नहीं है, Seam ढांचे आप केवल अद्यतन आप क्या चाहते हैं अनुमति देता है। इसलिए आपको चिंता करने की ज़रूरत नहीं है कि किस पैटर्न का उपयोग करना है।

संबंध है,

0

आप पृथक ऑब्जेक्ट को सीधे संशोधित कर सकते हैं और फिर सत्र पर merge विधि का उपयोग कर ऑब्जेक्ट को सत्र में दोबारा जोड़ सकते हैं।

3

ए) फिर से सत्र से अभिभावकीय उदाहरण पुनर्प्राप्त और अद्यतन क्षेत्रों

यह सबसे कार्यात्मक संस्करण है जो मैं पर इस्तेमाल हो रहा है हाथ द्वारा की जगह पिछले कुछ साल।

बी) स्टोर बाल कहीं (HttpSession?) और सहयोगी यह बाद।

मैं इसके खिलाफ सलाह दूंगा, खासकर यदि आप आरईएसटी प्रतिमान का पालन करना चाहते हैं जो सर्वर पक्ष को पूर्ण संख्या में नहीं देता है। और अगर आप अलग वस्तुओं के लिए ढेर स्थान का उपयोग कर खत्म हो जाएगा, हालांकि उपयोगकर्ता के लिए जो सत्र शुरू कॉफी :)

सी) जनक और अपरिवर्तनीय रूप बाल के बीच संबंध सेट के लिए छोड़ दिया है।

आईएमएचओ यह एक अच्छा तरीका नहीं है, हालांकि यह एक छोटे से प्रोजेक्ट मॉडल के साथ एक छोटी परियोजना के लिए उपयुक्त होगा। लेकिन कोड को संशोधित करने का प्रयास करते समय भी एक छोटे से एप्लिकेशन में यह सिरदर्द का कारण बन सकता है।

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

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