2010-01-07 9 views
85

सवाल शीर्षक में है। नीचे मैंने अभी अपने कुछ विचारों और निष्कर्षों का वर्णन किया है।कब और क्यों जेपीए इकाइयों को Serializable इंटरफ़ेस लागू करना चाहिए?

जब मेरे पास बहुत ही सरल डोमेन मॉडल (3 तालिकाओं के बिना किसी भी संबंध थे) मेरी सभी संस्थाओं ने Serializable लागू नहीं किया था।

लेकिन जब डोमेन मॉडल अधिक जटिल हो गया तो मुझे रनटाइम अपवाद मिला, जिसमें कहा गया कि मेरी इकाइयों में से एक ने Serializable को लागू नहीं किया है।

मैं एक जेपीए कार्यान्वयन के रूप में हाइबरनेट का उपयोग करता हूं।

मुझे आश्चर्य है:

  1. यह विक्रेता विशिष्ट आवश्यकता/व्यवहार है?
  2. मेरी धारावाहिक संस्थाओं के साथ क्या होता है? क्या उन्हें भंडारण या स्थानांतरित करने के लिए क्रमिक होना चाहिए?
  3. किस पल में मेरी इकाई को क्रमबद्ध करने के लिए आवश्यक हो जाता है?

उत्तर

33

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

34

आप अपने संस्थाओं Serializable होने के लिए अगर तुम उन्हें, ओवर-द-तार (उनमें कुछ अन्य प्रतिनिधित्व करने के लिए क्रमानुसार) हस्तांतरण (http सत्र में संग्रहीत है जो बदले में सर्वलेट द्वारा हार्ड डिस्क के लिए धारावाहिक है की जरूरत की जरूरत है कंटेनर), आदि

बस दृढ़ता के लिए, Serializable कम से कम हाइबरनेट के साथ आवश्यक नहीं है। लेकिन उन्हें Serializable बनाने का सबसे अच्छा अभ्यास है।

+2

मुझे नहीं पता, शायद मेरी संस्थाओं को कहीं और स्थानांतरित किया जा रहा है। मैं हाइबरनेट + वसंत + जेएसएफ और टोमकैट का उपयोग करता हूं। इस श्रृंखला में स्थानांतरित होने पर कहां हो सकता है? – Roman

4

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

92

जेपीए युक्ति के अनुसार:

एक इकाई उदाहरण (एक दूरस्थ इंटरफेस के माध्यम से, उदाहरण के लिए) एक अलग वस्तु के रूप में मूल्य द्वारा पारित किया जा रहा है, तो इकाई वर्ग Serializable इंटरफ़ेस को लागू करना होगा।

"JSR 220: उद्यम JavaBeansTM, संस्करण 3.0 जावा हठ एपीआई संस्करण 3.0, अंतिम जारी कर सकता है 2, 2006"

+11

(+1) spec को देखकर हमेशा उपयोगी होता है – Bozho

+9

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

+0

मुझे हाइबरनेट के बारे में बिल्कुल यकीन नहीं है, लेकिन अन्य जेपीए प्रदाताओं के साथ ऐसे ऑपरेशन होते हैं जिन्हें प्रदाता को किसी इकाई (ऑब्जेक्ट) की एक प्रति बनाने की आवश्यकता होती है। 'Serializable' इसके साथ सहायक हो सकता है, और उदाहरण के लिए दृढ़ता के संदर्भ में 'क्लोनेबल' से अधिक संगत। – JimmyB

4

मेरा मानना ​​है कि आपकी समस्या को जटिल प्रकार (वर्ग) के एक क्षेत्र होने से संबंधित है जो एनोटेट नहीं किया गया है।

Class CustomerData { 
    int getAge(); 
    void setAge(int age); 
} 

@Entity 
Class Customer { 
    CustomerData getCustomerData(); 
    void setCustomerData(CustomerData data) 
} 

ऊपर मामले में CustomerData में सहेज लिया जाएगा: ऐसे मामलों में डिफ़ॉल्ट से निपटने के भंडारण के डेटाबेस में उस में वस्तु धारावाहिक रूप है (जो शायद आप क्या करना मतलब नहीं है) उदाहरण हो जाएगा डेटाबेस में एक बाइट सरणी फ़ील्ड इसके क्रमबद्ध रूप में है।

8

जेनआर -317 विनिर्देशों को संदर्भित करने वाले कॉनोर के अच्छे उत्तर के पूरक के लिए। आम तौर पर, ईएआर परियोजनाओं में एक ईजेबी मॉड्यूल होता है जिसमें रिमोट इंटरफेस के माध्यम से उजागर ईजेबी होते हैं। इस मामले में आपको अपनी इकाई बीन्स को क्रमबद्ध करने की आवश्यकता है क्योंकि वे रिमोट ईजेबी में एकत्रित हैं और नेटवर्क के माध्यम से वायर्ड होने के लिए बनाए गए हैं।

सीडीआई के बिना एक जेईई 6 युद्ध परियोजना: गैर-धारावाहिक जेपीए इकाइयों द्वारा समर्थित ईजेबी लाइट शामिल हो सकता है।

सीडीआई के साथ एक जेईई 6 युद्ध परियोजना: Beans that use session, application, or conversation scope must be serializable, but beans that use request scope do not have to be serializable. इस प्रकार अंतर्निहित जेपीए इकाई सेम - अगर कोई भी समान अर्थशास्त्र का पालन करेगा।

1

hibernate docs के अनुसार, एनोटेशन @JoinColumn का उपयोग करते समय:

यह एक और मापदंडों का नाम दिया है referencedColumnName। यह पैरामीटर लक्षित इकाई में कॉलम घोषित करता है जिसका उपयोग शामिल होने के लिए किया जाएगा। ध्यान दें कि गैर प्राथमिक कुंजी कॉलम पर referencedColumnName का उपयोग करते समय, संबंधित कक्षा Serializable होनी चाहिए।

0

यह भी त्रुटि है जो गलत तरीके से टाइप की गई आईडी को em.find() (यानी आईडी को इसके बजाय इकाई को पास करने) के दूसरे पैरा के रूप में पास करते समय फेंक दिया जाता है। मुझे वास्तव में जेपीए इकाइयों को धारावाहिक घोषित करने के लिए अभी तक जरूरी नहीं मिला है - जब तक आप अमन द्वारा वर्णित संदर्भित कॉलमनाम का उपयोग नहीं कर रहे हैं, तब तक यह वास्तव में जरूरी नहीं है।

0

डाकिया या AJAX या कोणीय जेएस इत्यादि का उपयोग कर रिमोट हिट ....., जैक्सन fastxml के साथ StackOverflow अपवाद के साथ दोहराव चक्र का कारण बन सकता है। तो, serializer का उपयोग करना बेहतर है।

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