2011-01-17 9 views
8

मान लिया जाये कि मैं इस वर्ग है:क्या मैं बिल्डर डिजाइन पैटर्न का उपयोग हाइबरनेट के साथ कर सकता हूं?

public class MyEntity { 
    private int id; 
    private String name; 
    private MyEntity(int id, String name) {this.id= id; this.name = name;} 
    public static class MyEntityBuilder { 
    private int id; 
    private String name; 
    private MyEntityBuilder setId(int id) {this.id = id;} 
    private MyEntityBuilder setName(String name) {this.name = name;} 
    private MyEntity build() {return new MyEntity(id,name);} 
    } 
    private int getId() {return id;} 
    private String getName() {return name;} 
} 

मैं हाइबरनेट व्याख्या का उपयोग कर सकते हैं एक मेज पर यह मैप करने के लिए?

उत्तर

4

बिल्डर ऑब्जेक्ट्स बनाने के लिए बाहरी तंत्र है। यह पर्याप्त है कि आप अपनी इकाई के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करते हैं, और हाइबरनेट इस बात पर ध्यान नहीं देगा कि आपने इसे कैसे प्राप्त किया है। तो हाँ - यह एक सामान्य इकाई की तरह ही संभव है।

5

हां और नहीं। यदि आप सेटर्स भी प्रदान करते हैं तो आप इसका उपयोग कर सकते हैं।

हाइबरनेट गुणों तक पहुंचने के लिए जावा बीन्स का उपयोग करता है, इसलिए यह getXXX() और setXXX() विधियों पर निर्भर करता है। बिल्डर पैटर्न का पूरा बिंदु (कम से कम जोशुआ ब्लोच के अनुसार) सेटर्स के बिना अपरिवर्तनीय वस्तुओं को बनाना है। यह हाइबरनेट (या किसी भी ओआरएम) के साथ काम नहीं करेगा, क्योंकि वे मूल्यों को इंजेक्ट करने के लिए सेटर्स का उपयोग करते हैं।

लेकिन यदि आप अपने निर्माता और सेटर्स को बरकरार रखने के दौरान ऑब्जेक्ट जेनरेट करने के लिए एक धाराप्रवाह इंटरफ़ेस के रूप में अपने बिल्डर इंटरफ़ेस का उपयोग करना चाहते हैं, तो इसमें निश्चित रूप से कोई नुकसान नहीं है (इसके अलावा यह कोड का एक डुप्लिकेशंस है)।

बीटीडब्ल्यू: फ्लुएंट सेटर्स वैध जावा बीन्स सेटर्स मान्य नहीं हैं। Introspector तंत्र उन्हें समझ में नहीं आता है। सेटर्स के पास शून्य वापसी का प्रकार होना चाहिए।

+0

ऐसा है? मैंने सोचा कि यदि आप संपत्ति का उपयोग चुनते हैं (संपत्ति पर @ कॉलम रखें, एक्सेस विधियों पर नहीं) कोई हाइबरनेट में आउट सेटर्स के साथ कर सकता है? या उन्हें निजी बनाते हैं .. पैटर्न से आंतरिक बिल्डर वर्ग के बारे में क्या। क्या यह हाइबरनेट के लिए एक समस्या है? – bert

+1

@bert अपने शब्द के साथ सावधान रहें: जो आप वर्णन करते हैं वह फ़ील्ड एक्सेस है, न कि संपत्ति का उपयोग। जावा में, एक संपत्ति को इसके गेटटर और/या सेटर विधियों द्वारा परिभाषित किया जाता है, न कि अंतर्निहित क्षेत्र द्वारा। यह फ़ील्ड एनोटेट करते समय काम कर सकता है, लेकिन यदि फ़ील्ड को अंतिम के रूप में चिह्नित नहीं किया जाता है (जिसे निर्माता के साथ बनाई गई वस्तुओं के लिए अच्छा अभ्यास माना जाएगा)। नहीं, आंतरिक वर्ग एक समस्या नहीं है, जब तक कि यह स्थिर है और @Entity के रूप में चिह्नित नहीं है। –

+0

धन्यवाद। और आप बिल्कुल सही हैं। मेरा मतलब संपत्ति का उपयोग था। मेरा उपयोग केस है जहां मैप किए गए फ़ील्ड 'updatable = false' हैं और मैं इसे एपीआई में लागू करना चाहता हूं। – bert

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