नो-लॉजिक कंस्ट्रक्टर एक आवश्यकता है (हाइबरनेट जैसे उपकरण इस कंस्ट्रक्टर पर ऑब्जेक्ट्स को इंस्टेंट करने के लिए प्रतिबिंब का उपयोग करते हैं)।
मुझे यह हाथ से लहराया जवाब मिला लेकिन क्या कोई और समझा सकता है? धन्यवाद
नो-लॉजिक कंस्ट्रक्टर एक आवश्यकता है (हाइबरनेट जैसे उपकरण इस कंस्ट्रक्टर पर ऑब्जेक्ट्स को इंस्टेंट करने के लिए प्रतिबिंब का उपयोग करते हैं)।
मुझे यह हाथ से लहराया जवाब मिला लेकिन क्या कोई और समझा सकता है? धन्यवाद
Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Student
उस स्थिति में रिपोर्ट करेगा जिसमें मैंने अभी सामना किया है
जवाबों:
हाइबरनेट, और सामान्य रूप से कोड जो प्रतिबिंब Class<T>.newInstance()
वर्गों के माध्यम से अपनी कक्षाओं का एक नया उदाहरण बनाने के लिए उपयोग करता है । इस विधि के लिए एक सार्वजनिक नो-आर्ग कंस्ट्रक्टर की आवश्यकता होती है जो ऑब्जेक्ट को तुरंत करने में सक्षम हो। अधिकांश उपयोग के मामलों के लिए, एक नो-आर्ग कंस्ट्रक्टर प्रदान करना कोई समस्या नहीं है।
सीरियलाइजेशन के आधार पर हैक होते हैं जो एक नो-आर्ग कंस्ट्रक्टर न होने के आसपास काम कर सकते हैं, क्योंकि सीरियलाइजेशन जेवीएम मैजिक का उपयोग करता है ताकि कंस्ट्रक्टर को इनवॉइस किए बिना ऑब्जेक्ट बनाया जा सके। लेकिन यह सभी वीएम पर उपलब्ध नहीं है। उदाहरण के लिए, XStream उन वस्तुओं का उदाहरण बना सकता है जिनके पास सार्वजनिक नहीं-arg निर्माता है, लेकिन केवल तथाकथित "एन्हांस्ड" मोड में चलने से जो केवल कुछ VMs पर उपलब्ध है। (विवरण के लिए लिंक देखें।) हाइबरनेट के डिजाइनरों ने निश्चित रूप से सभी वीएम के साथ संगतता बनाए रखने के लिए चुना और इसलिए इस तरह की चालों से बचा जाता है, और आधिकारिक तौर पर समर्थित प्रतिबिंब विधि का उपयोग करता है, Class<T>.newInstance()
जिसमें एक नो-आर्ग कंस्ट्रक्टर की आवश्यकता होती है।
setAccessible(true)
पर हाइबरनेट होना चाहिए ।
ObjectInputStream
कुछ sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToGetInstanceOf, Object.class.getConstructor()).newInstance()
डिफॉल्ट कंस्ट्रक्टर (विंडोज के लिए JDK1.6) के साथ वस्तुओं को त्वरित करने के लिए कुछ-कुछ होता है
It can have package visibility and Hibernate should setAccessible(true)
। क्या it
इसका मतलब यह है कि कक्षा को प्रतिबिंब के माध्यम से त्वरित किया जा रहा है? और क्या Hibernate should setAccessible(true)
मतलब है?
हाइबरनेट आपकी वस्तुओं को तुरंत बदल देता है। तो यह उन्हें तुरंत करने में सक्षम होने की जरूरत है। यदि कोई कोई आर्ग-कंस्ट्रक्टर नहीं है, तो हाइबरनेट को यह पता नहीं चलेगा कि इसे कैसे इंस्टेंट किया जाए, यानी किस तर्क से पारित किया जाए।
हाइबरनेट प्रलेखन का कहना है:
4.1.1। नो-लॉजिक कंस्ट्रक्टर को लागू करें
सभी लगातार कक्षाओं में एक डिफ़ॉल्ट कंस्ट्रक्टर होना चाहिए (जो गैर-सार्वजनिक हो सकता है) ताकि हाइबरनेट उनका उपयोग करके तुरंत कर सके Constructor.newInstance()
। यह अनुशंसा की जाती है कि आपके पास हाइबरनेट में रनटाइम प्रॉक्सी पीढ़ी के लिए कम से कम पैकेज दृश्यता के साथ एक डिफ़ॉल्ट निर्माता है।
एर्म, सभी को क्षमा करें, लेकिन हाइबरनेट को यह आवश्यक नहीं है कि आपकी कक्षाओं में एक पैरामीटर रहित निर्माता होना चाहिए। जेपीए 2.0 विनिर्देश यह आवश्यकता है, और इस जेपीए की ओर से बहुत लंगड़ा है। JAXB जैसे अन्य फ्रेमवर्क को भी इसकी आवश्यकता होती है, जो उन फ्रेमवर्क की ओर से बहुत लंगड़ा है।
(वास्तव में, JAXB कथित रूप से इकाई कारखानों को अनुमति देता है, लेकिन यह इन कारखानों को खुद से ही चालू करने पर जोर देता है, जिसके लिए उन्हें आवश्यकता होती है - एक महत्वपूर्ण - पैरामीटर रहित निर्माता , जो कि मेरी पुस्तक में कारखानों को अनुमति नहीं देने के समान ही अच्छा है; कितना लंगड़ा है) !)
लेकिन हाइबरनेट को ऐसी चीज की आवश्यकता नहीं है।
हाइबरनेट एक अवरोधन तंत्र का समर्थन करता है, ( प्रलेखन में "इंटरसेप्टर" देखें) ), जो आपको अपनी वस्तुओं को तत्काल निर्माण करने की अनुमति देता है, जो भी निर्माता मापदंडों की आवश्यकता होती है।
असल में, आप क्या करते हैं कि जब आप हाइबरनेट सेट करते हैं, तो आप इसे org.hibernate.Interceptor
इंटरफ़ेस को लागू करने वाली वस्तु के रूप में पास करते हैं , और हाइबरनेट तब instantiate()
उस इंटरफ़ेस की विधि को लागू कर रहा होगा, जब भी उसे किसी वस्तु के नए उदाहरण की आवश्यकता होती है, तो आपका उस तरीके का कार्यान्वयन new
आप की तरह जो भी अपनी वस्तुओं में।
मैंने इसे एक परियोजना में किया है और यह एक आकर्षण की तरह काम करता है। इस परियोजना में मैं जब भी संभव हो जेपीए के माध्यम से चीजें करता हूं, और मैं केवल इंटरसेप्टर की तरह हाइबरनेट सुविधाओं का उपयोग करता हूं जब मेरे पास कोई अन्य विकल्प नहीं होता है।
हाइबरनेट इसके बारे में कुछ असुरक्षित लगता है, क्योंकि स्टार्टअप के दौरान यह मेरी प्रत्येक इकाई वर्गों के लिए एक सूचना संदेश जारी करता है, मुझे बताता है INFO: HHH000182: No default (no-argument) constructor for class
औरclass must be instantiated by Interceptor
फिर बाद में मैं उन्हें इंटरसेप्टर द्वारा तुरंत करता हूं, और इससे खुश हूं।
हाइबरनेट के अलावा अन्य साधनों के लिए "क्यों" सवाल का हिस्सा है , इसका जवाब "बिल्कुल कोई अच्छा कारण नहीं है", और यह हाइबरनेट इंटरसेप्टर के अस्तित्व से साबित होता है। ऐसे कई उपकरण हैं जो क्लाइंट ऑब्जेक्ट इंस्टेंटेशन के लिए कुछ समान तंत्र का समर्थन कर सकते हैं, लेकिन वे नहीं करते हैं, इसलिए वे ऑब्जेक्ट्स को स्वयं बनाते हैं, इसलिए उन्हें पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है। मुझे विश्वास है कि ऐसा हो रहा है क्योंकि इन उपकरणों के निर्माता खुद को निंजा सिस्टम प्रोग्रामर के रूप में सोचते हैं जो अज्ञानी अनुप्रयोग प्रोग्रामर द्वारा उपयोग किए जाने के लिए जादू से भरा फ्रेमवर्क बनाते हैं, जो (इसलिए उन्हें लगता है) उनके बेतहाशा सपनों में कभी नहीं होगा ... कारखाने पैटर्न के रूप में इस तरह के उन्नत निर्माण के लिए की जरूरत है । (ठीक है, मैं हूंऐसा सोचने के लिए। मैं वास्तव में ऐसा नहीं सोचता। मै मज़ाक कर रहा हूँ।)
Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Student
जो हाल ही में घटित हुए हैं क्योंकि javax.persistence.*;
उपयोग किया जाता है और केवल org.hibernate
बनाते समयSession, SessionFactory, and Configuration
हाइबरनेट एक ओआरएम फ्रेमवर्क है जो फील्ड या प्रॉपर्टी एक्सेस की रणनीति का समर्थन करता है। हालांकि, यह कंस्ट्रक्टर-आधारित मैपिंग का समर्थन नहीं करता है - शायद आप क्या चाहते हैं? - जैसे कुछ मुद्दों के कारण
1 class क्या होता है कि आपकी कक्षा में बहुत सारे निर्माता हैं
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) { ... }
public Person(String name) { ... }
public Person(Integer age) { ... }
}
जैसा कि आप देख सकते हैं, आप असंगति के एक मुद्दे से निपटते हैं क्योंकि हाइबरनेट यह नहीं मान सकता कि किस निर्माता को बुलाया जाना चाहिए। उदाहरण के लिए, मान लीजिए कि आपको एक संग्रहीत व्यक्ति ऑब्जेक्ट को पुनः प्राप्त करना है
Person person = (Person) session.get(Person.class, <IDENTIFIER>);
एक व्यक्ति वस्तु को पुनः प्राप्त करने के लिए किस निर्माता को हाइबरनेट कॉल करना चाहिए? क्या तुम देख सकते हो ?
2 और अंत में, परावर्तन का उपयोग करके, हाइबरनेट अपने अ-अर्ग कंस्ट्रक्टर के माध्यम से एक वर्ग को तुरंत रोक सकता है। तो जब तुम बुलाओगे
Person person = (Person) session.get(Person.class, <IDENTIFIER>);
सीतनिद्रा में होना आपके व्यक्ति वस्तु को तुरंत निम्नानुसार होगा
Person.class.newInstance();
जो एपीआई प्रलेखन के अनुसार
खाली तर्क सूची के साथ एक नई अभिव्यक्ति के द्वारा वर्ग को तुरंत समझा जाता है
कहानी का नैतिक
Person.class.newInstance();
के समान है
new Person();
और कुछ नहीं
name
और age
? यदि नहीं, तो यह बाद में किसी अन्य निर्माता का उपयोग करता है?
वास्तव में, आप उन कक्षाओं को तत्काल कर सकते हैं जिनमें कोई 0-आर्ग्स कंस्ट्रक्टर नहीं है; आप एक श्रेणी के निर्माणकर्ताओं की सूची प्राप्त कर सकते हैं, एक को चुन सकते हैं और इसे फर्जी मापदंडों के साथ लागू कर सकते हैं।
हालांकि यह संभव है, और मुझे लगता है कि यह काम करेगा और समस्याग्रस्त नहीं होगा, आपको सहमत होना पड़ेगा कि यह बहुत अजीब है।
हाइबरनेट जिस तरह से वस्तुओं का निर्माण करता है (मेरा मानना है कि यह 0-arg कंस्ट्रक्टर को आमंत्रित करता है और फिर यह संभवतः उदाहरण के क्षेत्रों को सीधे परावर्तन के माध्यम से संशोधित करता है। शायद यह जानता है कि कैसे कॉल करने वाले को कॉल किया जाता है) एक वस्तु के निर्माण में माना जाता है के खिलाफ थोड़ा सा जाता है। जावा- उपयुक्त पैरामीटर के साथ कंस्ट्रक्टर को लागू करें ताकि नई वस्तु वह वस्तु हो जो आप चाहते हैं। मेरा मानना है कि किसी वस्तु को तात्कालिक बनाना और फिर उसे बदलना कुछ हद तक "एंटी-जावा" है (या मैं कहूंगा, एंटी थ्योरिटिकल जावा) - और निश्चित रूप से, अगर आप प्रत्यक्ष क्षेत्र हेरफेर के माध्यम से ऐसा करते हैं, तो यह एनकैप्सुलेशन और सभी कि फैंसी एनकाउंटर सामान जाता है ।
मुझे लगता है कि ऐसा करने का उचित तरीका हाइबरनेट मैपिंग में यह परिभाषित करना होगा कि कैसे डेटाबेस को उचित तरीके से कंस्ट्रक्टर पंक्ति का उपयोग करते हुए जानकारी से इंस्टेंट किया जाना चाहिए ... लेकिन यह अधिक जटिल होगा - मतलब दोनों हाइबरनेट भी होंगे अधिक जटिल, मानचित्रण अधिक जटिल होगा ... और सभी अधिक "शुद्ध" होंगे; और मुझे नहीं लगता कि इससे वर्तमान दृष्टिकोण ("उचित तरीके" से काम करने के बारे में अच्छा महसूस करने के अलावा) पर एक फायदा होगा।
ऐसा कहने के बाद, और यह देखते हुए कि हाइबरनेट दृष्टिकोण बहुत "साफ" नहीं है, 0-arg कंस्ट्रक्टर के लिए बाध्यता सख्ती से आवश्यक नहीं है, लेकिन मैं कुछ हद तक आवश्यकता को समझ सकता हूं, हालांकि मेरा मानना है कि उन्होंने विशुद्ध रूप से "उचित तरीके से" किया। "मैदान, जब वे" उचित तरीके से "(उचित कारणों के लिए यद्यपि) से बहुत पहले भटक गए।
हाइबरनेट को आपके प्रश्नों के परिणाम के रूप में उदाहरणों को बनाने की आवश्यकता है (प्रतिबिंब के माध्यम से), हाइबरनेट उस के लिए संस्थाओं के नो-आर्ग कंस्ट्रक्टर पर निर्भर करता है, इसलिए आपको नो-अर्ग कंस्ट्रक्टर प्रदान करने की आवश्यकता है। क्या स्पष्ट नहीं है?
private
कंस्ट्रक्टर गलत किन स्थितियों में है ? मैं अपनी जेपीए इकाई के लिए java.lang.InstantiationException
एक private
निर्माता के साथ भी देख रहा हूं । संदर्भ ।
परावर्तन के माध्यम से एक पैरामीटर रहित कंस्ट्रक्टर के साथ ऑब्जेक्ट बनाना बहुत आसान है, और फिर किसी पैरामीटरेड कॉन्ट्रैक्टर के अनियंत्रित मापदंडों को मनमाने ढंग से बदलने / नामकरण संघर्ष के साथ, कंस्ट्रक्टर के अंदर अपरिभाषित लॉजिक के साथ डेटा को मैच करने के बजाय, प्रतिबिंब के माध्यम से इसके गुणों को भरें। पैरामीटर किसी वस्तु, एट वगैरह के गुण मिलान नहीं करता है।
कई ओआरएम और धारावाहिकों को पैरामीटर रहित कंस्ट्रक्टर की आवश्यकता होती है, क्योंकि प्रतिबिंब के माध्यम से पैरामैटराइज्ड कंस्ट्रक्टर बहुत नाजुक होते हैं, और पैरामीटर रहित कंस्ट्रक्टर अनुप्रयोग को स्थिरता प्रदान करते हैं और डेवलपर के लिए ऑब्जेक्ट व्यवहार पर नियंत्रण रखते हैं।
हाइबरनेट आलसी लोडिंग के लिए परदे के पीछे का उपयोग करता है। यदि आप एक कंस्ट्रक्टर को परिभाषित नहीं करते हैं या इसे निजी बनाते हैं तो कुछ चीजें अभी भी काम कर सकती हैं - जो कि प्रॉक्सी तंत्र पर निर्भर नहीं हैं। उदाहरण के लिए, क्वेरी API का उपयोग करके ऑब्जेक्ट को (बिना किसी कंस्ट्रक्टर के साथ) सीधे लोड करना।
लेकिन, यदि आप सेशन का उपयोग करते हैं, तो आप कंस्ट्रक्टर की अनुपलब्धता के कारण प्रॉक्सी जनरेटर लिब से इंस्टेंटेशन एक्सेप्शन का सामना करेंगे।
इस आदमी ने एक समान स्थिति की सूचना दी:
http://kristian-domagala.blogspot.com/2008/10/proxy-instantiation-problem-from.html
जावा भाषा युक्ति के इस खंड की जाँच करें जो स्थैतिक और गैर-स्थैतिक आंतरिक वर्गों के बीच अंतर को बताता है: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3
एक स्थिर आंतरिक वर्ग वैचारिक रूप से .java फ़ाइल में घोषित एक सामान्य सामान्य वर्ग से अलग नहीं है।
चूंकि हाइबरनेट को प्रोजेक्ट उदाहरण से स्वतंत्र रूप से ProjectPK को तत्काल करने की आवश्यकता होती है, ProjectPK को या तो एक स्थिर आंतरिक वर्ग होने की आवश्यकता होती है, या वह स्वयं .java फ़ाइल में घोषित की जाती है।
संदर्भ org.hibernate.InstantiationException: कोई डिफ़ॉल्ट निर्माता नहीं
The no-argument constructor is a requirement
गलत है , और सभी उत्तर जो यह बताने के लिए आगे बढ़ते हैं कि ऐसा क्यों है, यह सवाल किए बिना कि क्या यह वास्तव में ऐसा है, (स्वीकृत उत्तर सहित, जो कि इनाम भी मिला है) गलत हैं । इसका उत्तर देखें: stackoverflow.com/a/29433238/773113