2009-06-22 16 views
11

मुझे जेपीए इकाइयों पर कम से कम एक खाली कन्स्ट्रक्टर और सार्वजनिक सेटर्स की आवश्यकता पसंद नहीं है। जबकि मैं EntityManager पक्ष पर समस्या को समझता हूं, यह वर्ग आविष्कार को अमान्य करता है।जेपीए एंटरसाइट्स पर खाली कन्स्ट्रक्टर और सेटर्स

क्या किसी के पास इस (डिज़ाइन पैटर्न या मुहावरे स्तर) का समाधान है?

धन्यवाद!

इगोर

उत्तर

1
DataNucleus साथ

आप एक डिफ़ॉल्ट निर्माता को जोड़ने के लिए यदि आप नहीं करना चाहते हैं की जरूरत नहीं है; इसे बाइटकोड एन्हांसमेंट द्वारा स्वचालित रूप से जोड़ा जाएगा। इसके अलावा आप गुणों के बजाय फ़ील्ड बना सकते हैं, इसलिए सार्वजनिक सेटर्स की आवश्यकता नहीं है।

--Andy (DataNucleus)

0

हाँ, गुण के बजाय खेतों जारी रहती है, लेकिन कोई डिफ़ॉल्ट निर्माता आप आम तौर पर कर रहे हैं नहीं चाहते पर (जब तक बाइट कोड बढ़ाने कुछ काम कर देता है) आप नहीं जा रहे हैं इससे दूर हो जाओ।

आपको कक्षा को तुरंत चालू करने के लिए अपने जेपीए कार्यान्वयन की अनुमति देनी है, इसलिए एक सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर अनिवार्य है।

+0

इसे सार्वजनिक –

17

जेपीए के साथ, डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है, हालांकि, आपको सेटर्स का उपयोग करने की आवश्यकता नहीं है। आप एनोटेशन कहां रखते हैं, इस आधार पर आप एक संपत्ति पहुंच रणनीति (फ़ील्ड या विधि) चुन सकते हैं।

निम्नलिखित कोड प्रत्यक्ष क्षेत्र पहुँच का उपयोग करेगा और एक सेटर के बिना एक इकाई के एक भाग के रूप में काम करेगा:

@Column(name = DESCRIPTION) 
private String description; 

public String getDescription() { return description; } 

एक सेटर के साथ विधि का उपयोग बनाम:

private String description; 

@Column(name = DESCRIPTION) 
public void setDescription(String description) { 
    this.description = description; 
} 

public String getDescription() { return description; } 
2

बस अपने निर्माता बनाने संरक्षित या निजी, तो आप वर्ग आविष्कारों को संरक्षित करते हैं!

 
public class Person { 
private String firstName; 
private String lastName; 

public Person(String firstName, String lastName) { 
    setFirstName(firstName); 
    setLastName(lastName); 
} 

// private no-arg constructor for hibernate. 
private Person() { 

} 

public String getFirstName() { 
    return firstName; 
} 
public String getLastName() { 
    return lastName; 
} 

// private setters for hibernate 
private void setFirstName(String nme) { 
    firstName = nme; 
} 
private void setLastName(String nme) { 
    lastName = nme; 
} 
} 

विवरण के लिए http://www.javalobby.org/java/forums/m91937279.html देखें।

3

ओपनजेपीए आपकी संस्थाओं को बढ़ाने के एक हिस्से के रूप में नो-एर्ग सीटीआर जोड़ सकता है।

बस इतना स्पष्ट है कि जेपीए स्पेक में आवश्यकता जरूरी है। पिछले जवाब में कहा गया है कि आप नो-एर्ग सीटीआर निजी बना सकते हैं, लेकिन यह spec के अनुरूप नहीं है (मैं लिंक को हाइबरनेट विशिष्ट पृष्ठ पर देखता हूं)। कल्पना बताती है कि एक इकाई के पास सार्वजनिक या संरक्षित नो-एर्ग सीटीआर होना चाहिए।

-रिक

6

असल में तुम दोनों को नो-args निर्माता और मनुष्य और सेटर तरीके होना चाहिए। spec की धारा 2.1 में आवश्यकताओं को इंगित किया गया है।

कोई आर्ग निर्माता आवश्यकता मेरी कॉपी में पेज 17 पर पाया जाता है:

इकाई वर्ग को नो-आर्ग निर्माता होना आवश्यक है। इकाई वर्ग में अन्य रचनाकार भी हो सकते हैं। नो-एर्ग कन्स्ट्रक्टर सार्वजनिक होना चाहिए या संरक्षित होना चाहिए।

पृष्ठ 18 एक्सेसर तरीकों के लिए आवश्यकता है:

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

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

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

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

यह आदर्श नहीं है लेकिन इसे गलत सीटीआर को दुर्घटना से उपयोग करने से रोकना चाहिए (मुझे लगता है कि आपके पास एक सीटीओआर है जो इनवेरिएंट सेट करता है)।

+2

के बजाय भी संरक्षित किया जा सकता है, दूसरा उद्धरण आपने केवल घोषणा की है कि उपयोगकर्ता के आवेदन में अन्य वर्गों को सीधे इकाई के फ़ील्ड तक नहीं पहुंचना चाहिए। यह जेपीए प्रदाता के लिए एक्सेसर्स मौजूद नहीं है। असल में, अगली वाक्य "एक इकाई की निरंतर स्थिति को जावाबीन स्टाइल प्रॉपर्टी एक्सेसर्स (" प्रॉपर्टी एक्सेस ") या इंस्टेंस वैरिएबल (" फील्ड एक्सेस ") के माध्यम से दृढ़ता प्रदाता रनटाइम द्वारा एक्सेस किया जाता है।" यह मेरे लिए बहुत स्पष्ट प्रतीत होता है कि यदि आप फ़ील्ड एक्सेस का उपयोग कर रहे हैं, तो आपको एक्सेसर्स की आवश्यकता नहीं है, इस प्रकार आपको केवल-पढ़ने योग्य चर लगने की अनुमति मिलती है। – Pace

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

  • कोई संबंधित समस्या नहीं^_^