कब और क्यों जेपीए संस्थाओं को सीरियल इंटरफ़ेस लागू करना चाहिए?


151

सवाल शीर्षक में है। नीचे मैंने अपने कुछ विचारों और निष्कर्षों का वर्णन किया है।

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

लेकिन जब डोमेन मॉडल अधिक जटिल हो गया तो मुझे RuntimeException मिली, जिसमें कहा गया था कि मेरी एक संस्था ने Serializable को लागू नहीं किया।

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

मैं सोचता हूं:

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

जवाबों:


59

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


यह व्याख्या नहीं करता है कि सिर्फ "शायद कैसे" बोझो से नीचे का जवाब देखें
क्रिप्स

इसका मतलब यह है कि धारावाहिक परिवर्तनशील इंटरफ़ेस को लागू करने के साथ इकाई को DB में सहेजा जाएगा?
हनुमंथ_3048092

@ हनुमंथ_3048092 हां। इकाई मानचित्रण और Serializableदो अलग-अलग अवधारणाएं हैं।
आरोन दिगुल्ला

@AaronDigulla क्या आप इसे एक उदाहरण या छद्म कोड द्वारा समझा सकते हैं।
sdindiver

110

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

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

"JSR 220: एंटरप्राइज़ JavaBeansTM, संस्करण 3.0 जावा दृढ़ता API संस्करण 3.0, अंतिम रिलीज़ 2 मई, 2006"


14
(+1) युक्ति को
देखना

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

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

यह उत्तर सिर्फ एक जानकारी डंप है और किसी को भी यह समझने में मदद नहीं करता है कि क्यों।
क्रिप्स

59

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

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


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

@ रमन उदाहरण के लिए वर्तमान उपयोगकर्ता (जो एक इकाई हो सकता है) और इसके सभी संबंधित सत्र सत्र में समाप्त हो सकते हैं, जैसा कि बोझो का कहना है कि सर्वलेट कंटेनर द्वारा डिस्क पर क्रमबद्ध किया जा सकता है।
ऑरेंजडॉग

यह सबसे अच्छा जवाब है "क्यों और कब"! स्पष्ट! धन्यवाद
chrips

13

हाइबरनेट डॉक्स के अनुसार , @ जॉइनकॉल्यूमेंट एनोटेशन का उपयोग करते समय:

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


8

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

CDI के बिना एक JEE6 युद्ध परियोजना: गैर-धारावाहिक JPA संस्थाओं द्वारा समर्थित EJB लाइट हो सकती है।

CDI के साथ एक JEE6 युद्ध परियोजना: बीन्स जो सत्र, अनुप्रयोग, या वार्तालाप स्कोप का उपयोग करते हैं, क्रमबद्ध होना चाहिए, लेकिन बीन्स जो अनुरोध गुंजाइश का उपयोग करते हैं, उन्हें क्रमबद्ध होने की आवश्यकता नहीं है। इस प्रकार अंतर्निहित जेपीए इकाई बीन्स-किसी भी - एक ही शब्दार्थ का पालन करेगी।


7

अगर हम सिर्फ दृढ़ता के बारे में बात करते हैं, Serializableकी जरूरत नहीं है , लेकिन संस्थाओं को बनाने के लिए यह सबसे अच्छा अभ्यास है Serializable

यदि हम उपयोग करने के बजाय सीधे प्रस्तुति परत के संपर्क में आ रहे हैं domain/ entitiesवस्तुओं DTO, उस मामले में हमें लागू करने की आवश्यकता है Serializableये डोमेन ऑब्जेक्ट HTTPSessionकैशिंग / ऑप्टिमाइज़ेशन उद्देश्यों के लिए संग्रहीत किए जा सकते हैं। Http-सत्र को क्रमबद्ध या क्लस्टर किया जा सकता है। और यह भी आवश्यक है कि डेटा को बीच-बीच में स्थानांतरित किया JVMजाए।

जब हम DTOदृढ़ता परत और सेवा परत को कम करने के लिए उपयोग करते हैं, तो डोमेन ऑब्जेक्ट्स को चिह्नित Serializableकरना काउंटर उत्पादक होगा और " encapsulation" का उल्लंघन करेगा । तब यह एक विरोधी पैटर्न बन जाता है।

समग्र पहचानकर्ता

प्राथमिक कुंजी वर्ग क्रमबद्ध होना चाहिए।

POJO मॉडल

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

कैश
इसके अलावा, यदि आप एक clusteredदूसरे स्तर को लागू कर रहे हैं cacheतो आपकी इकाइयाँ होनी चाहिए serializable। पहचानकर्ता को होना चाहिए Serializableक्योंकि यह एक जेपीए आवश्यकता है क्योंकि identifierदूसरे स्तर के कैश प्रविष्टि के लिए कुंजी के रूप में उपयोग किया जा सकता है।

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


6

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

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

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

उपरोक्त मामले में CustomerData अपने क्रमबद्ध रूप में डेटाबेस में एक बाइट सरणी फ़ील्ड में सहेजा जाएगा।


5

जेपीए विनिर्देश

जेपीए विनिर्देश के अनुसार, एक इकाई को Serializableकेवल तभी लागू होना चाहिए जब उसे एक जेवीएम से दूसरे में पास करने की आवश्यकता हो या यदि इकाई का उपयोग स्टेटफुल सेशन बीन द्वारा किया जाता है जिसे ईजेबी कंटेनर द्वारा पारित करने की आवश्यकता होती है।

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

हाइबरनेट

सीतनिद्रा में होना केवल यह है कि इकाई गुण हैं Serializable, लेकिन इकाई ही नहीं।

हालांकि, जेपीए विनिर्देश Serializableको लागू करने से, संस्थाओं के बारे में जेपीए की सभी आवश्यकताएं हाइबरनेट पर भी लागू होती हैं।

बिल्ला

टॉमकैट डोक्यूमैंटेशन के अनुसार , HttpSessionविशेषताओं का होना भी आवश्यक है Serializable:

जब भी Apache Tomcat को सामान्य रूप से बंद किया जाता है और पुनः आरंभ किया जाता है, या जब कोई एप्लिकेशन पुनः लोड होता है, तो मानक प्रबंधक कार्यान्वयन सभी वर्तमान सक्रिय सत्रों को pathname विशेषता के माध्यम से स्थित डिस्क फ़ाइल में क्रमबद्ध करने का प्रयास करेगा। इस तरह के सभी सहेजे गए सत्रों को तब पुन: व्यवस्थित और सक्रिय किया जाएगा (यह मानते हुए कि वे उस समय में समाप्त नहीं हुए हैं) जब आवेदन पुनः लोड किया जाता है।

सत्र विशेषताओं को सफलतापूर्वक पुनर्स्थापित करने के लिए, ऐसी सभी विशेषताओं को java.io.Serializable इंटरफ़ेस को लागू करना होगा।

इसलिए, यदि इकाई में संग्रहीत किया जाता है HttpSession, तो इसे लागू करना चाहिए Serializable


4

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


3

कृपया http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to का कहना है कि, java.io.Serializable का कार्यान्वयन केवल JVM- इंस्टेंसेस के बीच IIOP या JRMP (RMI) के माध्यम से डेटा स्थानांतरित करने के लिए आवश्यक है। शुद्ध वेब एप्लिकेशन के मामले में डोमेन ऑब्जेक्ट कभी-कभी कैशिंग / ऑप्टिमाइज़ेशन उद्देश्यों के लिए HTTPSession में संग्रहीत किए जाते हैं। एक http- सत्र क्रमबद्ध (पैशन) या क्लस्टर किया जा सकता है। दोनों ही मामलों में सभी सामग्री को सीरियल करने योग्य होना चाहिए।


1

रिमोट हिट पोस्टमैन या अजाक्स या कोणीय js आदि का उपयोग करके ....., जैक्सन के साथ स्टैकऑवरफ्लो अपवाद के साथ पुनरावृत्ति चक्र का कारण बन सकता है। और, धारावाहिक का उपयोग करना बेहतर है।


1
  1. किस क्षण में मेरी इकाई को क्रमबद्ध बनाना आवश्यक हो जाता है?

दूसरे स्तर के कैश के रूप में डिस्कस्टोर के साथ एहकाशे को लागू करना (यानी @Cacheableएंटिटी या रिपॉजिटरी / सर्विस मेथड पर एनोटेशन का उपयोग करना ) के लिए सीरियल करने की आवश्यकता होती है, अन्यथा NotSerializableExceptionडिस्क कैश को इकाई लिखने के लिए कैश विफल ( ) हो जाएगा ।


0

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


0

जब JPA इकाइयां पैरामीटर के रूप में उपयोग की जाती हैं या दूरस्थ EJB संचालन द्वारा मान लौटाते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.