हाइबरनेट को किसी तर्क निर्माता की आवश्यकता क्यों नहीं है?


105

नो-लॉजिक कंस्ट्रक्टर एक आवश्यकता है (हाइबरनेट जैसे उपकरण इस कंस्ट्रक्टर पर ऑब्जेक्ट्स को इंस्टेंट करने के लिए प्रतिबिंब का उपयोग करते हैं)।

मुझे यह हाथ से लहराया जवाब मिला लेकिन क्या कोई और समझा सकता है? धन्यवाद


7
FYI करें: वह दावा जो The no-argument constructor is a requirement गलत है , और सभी उत्तर जो यह बताने के लिए आगे बढ़ते हैं कि ऐसा क्यों है, यह सवाल किए बिना कि क्या यह वास्तव में ऐसा है, (स्वीकृत उत्तर सहित, जो कि इनाम भी मिला है) गलत हैं । इसका उत्तर देखें: stackoverflow.com/a/29433238/773113
माइक नाकिस

2
यह आवश्यक है यदि आप JPA के लिए प्रदाता के रूप में हाइबरनेट का उपयोग कर रहे हैं।
अमलगोविनस

1
@ मायकेनकीस आप गलत माइक हैं। हाइबरनेट को ऑब्जेक्ट्स को तुरंत बनाने के लिए एक डिफ़ॉल्ट कंस्ट्रक्टर की आवश्यकता होती है यदि आप JPA (Amalgovinus) के लिए एक प्रदाता के रूप में हाइबरनेट का उपयोग कर रहे हैं अन्यथा हाइबरनेट Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Studentउस स्थिति में रिपोर्ट करेगा जिसमें मैंने अभी सामना किया है
Mushy

@ मौसी ने प्रश्न "हाइबरनेट" और "ऑर्म" के साथ टैग किया है, इसे "जेपा" के साथ टैग नहीं किया गया है। प्रश्न में जेपीए का कोई उल्लेख नहीं है।
माइक नकिस

1
@ मायकेनकिस मैं माइक से सहमत हूं लेकिन हाइबरनेट का उपयोग "जेपीए" के कार्यान्वयन के रूप में किया जाता है और "जेपीए" या "ओआरएम" की अनुपस्थिति में उपयोग नहीं किया जाता है। इसलिए, धारणा हाइबरनेट है "जेपीए" को लागू करना।
मुशी

जवाबों:


138

हाइबरनेट, और सामान्य रूप से कोड जो प्रतिबिंब Class<T>.newInstance()वर्गों के माध्यम से अपनी कक्षाओं का एक नया उदाहरण बनाने के लिए उपयोग करता है । इस विधि के लिए एक सार्वजनिक नो-आर्ग कंस्ट्रक्टर की आवश्यकता होती है जो ऑब्जेक्ट को तुरंत करने में सक्षम हो। अधिकांश उपयोग के मामलों के लिए, एक नो-आर्ग कंस्ट्रक्टर प्रदान करना कोई समस्या नहीं है।

सीरियलाइजेशन के आधार पर हैक होते हैं जो एक नो-आर्ग कंस्ट्रक्टर न होने के आसपास काम कर सकते हैं, क्योंकि सीरियलाइजेशन जेवीएम मैजिक का उपयोग करता है ताकि कंस्ट्रक्टर को इनवॉइस किए बिना ऑब्जेक्ट बनाया जा सके। लेकिन यह सभी वीएम पर उपलब्ध नहीं है। उदाहरण के लिए, XStream उन वस्तुओं का उदाहरण बना सकता है जिनके पास सार्वजनिक नहीं-arg निर्माता है, लेकिन केवल तथाकथित "एन्हांस्ड" मोड में चलने से जो केवल कुछ VMs पर उपलब्ध है। (विवरण के लिए लिंक देखें।) हाइबरनेट के डिजाइनरों ने निश्चित रूप से सभी वीएम के साथ संगतता बनाए रखने के लिए चुना और इसलिए इस तरह की चालों से बचा जाता है, और आधिकारिक तौर पर समर्थित प्रतिबिंब विधि का उपयोग करता है, Class<T>.newInstance()जिसमें एक नो-आर्ग कंस्ट्रक्टर की आवश्यकता होती है।


31
FYI करें: कंस्ट्रक्टर को सार्वजनिक होने की आवश्यकता नहीं है। इसमें पैकेज विजिबिलिटी हो सकती है और इस setAccessible(true)पर हाइबरनेट होना चाहिए ।
ग्रे

क्या मैं अपने कार्यों के लिए एक आवश्यक फ़ील्ड सेट करने के लिए एक गैर डिफ़ॉल्ट निर्माता के साथ एक कस्टम उपयोगकर्ता टाइप बनाने में सक्षम हूं।
एल-सैमुअल्स

1
संदर्भ के लिए ObjectInputStreamकुछ sun.reflect.ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToGetInstanceOf, Object.class.getConstructor()).newInstance()डिफॉल्ट कंस्ट्रक्टर (विंडोज के लिए JDK1.6) के साथ वस्तुओं को त्वरित करने के लिए कुछ-कुछ होता है
SamYonnou

पुन: It can have package visibility and Hibernate should setAccessible(true)। क्या itइसका मतलब यह है कि कक्षा को प्रतिबिंब के माध्यम से त्वरित किया जा रहा है? और क्या Hibernate should setAccessible(true)मतलब है?
केविन मेरेडिथ 21

Objenesis यह करता है और व्यापक रूप से वसंत-डेटा और mockito जैसे कई ढांचे द्वारा प्रयोग किया जाता है github.com/easymock/objenesis
ltfishie

47

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

हाइबरनेट प्रलेखन का कहना है:

4.1.1। नो-लॉजिक कंस्ट्रक्टर को लागू करें

सभी लगातार कक्षाओं में एक डिफ़ॉल्ट कंस्ट्रक्टर होना चाहिए (जो गैर-सार्वजनिक हो सकता है) ताकि हाइबरनेट उनका उपयोग करके तुरंत कर सके Constructor.newInstance()। यह अनुशंसा की जाती है कि आपके पास हाइबरनेट में रनटाइम प्रॉक्सी पीढ़ी के लिए कम से कम पैकेज दृश्यता के साथ एक डिफ़ॉल्ट निर्माता है।


6
कंस्ट्रक्टर दृश्यता के लिए, यदि आप JPA v2.0 नोटिस का उपयोग कर रहे हैं कि JSR-317 कहता है: नो-आर्ग कंस्ट्रक्टर को सार्वजनिक या संरक्षित होना चाहिए
जोस एंडियास

@ बोजो हेलो सर, मुझे एक संदेह है कि अगर आंतरिक रूप से हाइबरनेट का उपयोग कंस्ट्रक्टर.न्यू इनस्टैंस () वस्तु को तुरंत करने के लिए किया जाता है तो हाइबरनेट किसी भी सेटर्स को परिभाषित किए बिना फ़ील्ड में मान कैसे सेट करता है?
विकास वर्मा

मुझे नहीं लगता कि मैं सार्वजनिक @ -अगड़े निर्माता के साथ @Embeddable गैर-निजी उपवर्ग के लिए यह चेतावनी क्यों देख रहा हूं ...
अमलगोविनस

Constructor.newInstance () तर्क लेती है, मुद्दा (वास्तव में एक गैर-मुद्दा) उन तर्कों को मैप कर रहा है। पता नहीं क्यों हाइबरनेट ने इस समस्या को हल नहीं किया। तुलना के लिए: जैक्सन में @JsonCreator एनोटेशन ऐसा करता है, और अपरिवर्तनीय वस्तुओं का बहुत लाभ हुआ था।
ड्रोब


44

एर्म, सभी को क्षमा करें, लेकिन हाइबरनेट को यह आवश्यक नहीं है कि आपकी कक्षाओं में एक पैरामीटर रहित निर्माता होना चाहिए। जेपीए 2.0 विनिर्देश यह आवश्यकता है, और इस जेपीए की ओर से बहुत लंगड़ा है। JAXB जैसे अन्य फ्रेमवर्क को भी इसकी आवश्यकता होती है, जो उन फ्रेमवर्क की ओर से बहुत लंगड़ा है।

(वास्तव में, JAXB कथित रूप से इकाई कारखानों को अनुमति देता है, लेकिन यह इन कारखानों को खुद से ही चालू करने पर जोर देता है, जिसके लिए उन्हें आवश्यकता होती है - एक महत्वपूर्ण - पैरामीटर रहित निर्माता , जो कि मेरी पुस्तक में कारखानों को अनुमति नहीं देने के समान ही अच्छा है; कितना लंगड़ा है) !)

लेकिन हाइबरनेट को ऐसी चीज की आवश्यकता नहीं है।

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

असल में, आप क्या करते हैं कि जब आप हाइबरनेट सेट करते हैं, तो आप इसे org.hibernate.Interceptorइंटरफ़ेस को लागू करने वाली वस्तु के रूप में पास करते हैं , और हाइबरनेट तब instantiate()उस इंटरफ़ेस की विधि को लागू कर रहा होगा, जब भी उसे किसी वस्तु के नए उदाहरण की आवश्यकता होती है, तो आपका उस तरीके का कार्यान्वयन newआप की तरह जो भी अपनी वस्तुओं में।

मैंने इसे एक परियोजना में किया है और यह एक आकर्षण की तरह काम करता है। इस परियोजना में मैं जब भी संभव हो जेपीए के माध्यम से चीजें करता हूं, और मैं केवल इंटरसेप्टर की तरह हाइबरनेट सुविधाओं का उपयोग करता हूं जब मेरे पास कोई अन्य विकल्प नहीं होता है।

हाइबरनेट इसके बारे में कुछ असुरक्षित लगता है, क्योंकि स्टार्टअप के दौरान यह मेरी प्रत्येक इकाई वर्गों के लिए एक सूचना संदेश जारी करता है, मुझे बताता है INFO: HHH000182: No default (no-argument) constructor for classऔरclass must be instantiated by Interceptor फिर बाद में मैं उन्हें इंटरसेप्टर द्वारा तुरंत करता हूं, और इससे खुश हूं।

हाइबरनेट के अलावा अन्य साधनों के लिए "क्यों" सवाल का हिस्सा है , इसका जवाब "बिल्कुल कोई अच्छा कारण नहीं है", और यह हाइबरनेट इंटरसेप्टर के अस्तित्व से साबित होता है। ऐसे कई उपकरण हैं जो क्लाइंट ऑब्जेक्ट इंस्टेंटेशन के लिए कुछ समान तंत्र का समर्थन कर सकते हैं, लेकिन वे नहीं करते हैं, इसलिए वे ऑब्जेक्ट्स को स्वयं बनाते हैं, इसलिए उन्हें पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है। मुझे विश्वास है कि ऐसा हो रहा है क्योंकि इन उपकरणों के निर्माता खुद को निंजा सिस्टम प्रोग्रामर के रूप में सोचते हैं जो अज्ञानी अनुप्रयोग प्रोग्रामर द्वारा उपयोग किए जाने के लिए जादू से भरा फ्रेमवर्क बनाते हैं, जो (इसलिए उन्हें लगता है) उनके बेतहाशा सपनों में कभी नहीं होगा ... कारखाने पैटर्न के रूप में इस तरह के उन्नत निर्माण के लिए की जरूरत है । (ठीक है, मैं हूंऐसा सोचने के लिए। मैं वास्तव में ऐसा नहीं सोचता। मै मज़ाक कर रहा हूँ।)


1
अंत में, कोई है जो इसे प्राप्त करता है! मैंने अपना अधिक समय बिताया है क्योंकि मैं इन रूपरेखाओं से निपटना पसंद करता हूं जो वस्तु की तात्कालिकता प्रक्रिया को अस्पष्ट करता है (जो उचित निर्भरता इंजेक्शन के लिए और समृद्ध वस्तु व्यवहार के लिए बिल्कुल महत्वपूर्ण है)। इसके अलावा, Java परावर्तन आपको newInstance () का उपयोग किए बिना ऑब्जेक्ट बनाने की अनुमति देता है। विधि getDeclaredConstructors JDK 1.1 के बाद से प्रतिबिंब एपीआई में है। यह भयानक है कि जेपीए के कल्पना डिजाइनरों ने इसकी उपेक्षा की।
ड्रोब

ये गलत है। यदि हाइबरनेट को दृढ़ता के लिए जेपीए प्रदाता के रूप में उपयोग किया जाता है, तो उसे डिफ़ॉल्ट निर्माता की आवश्यकता होती है अन्यथा निम्नलिखित अनुलग्‍नक Caused by: org.hibernate.InstantiationException: No default constructor for entity: : hibernate.tutorial.Studentजो हाल ही में घटित हुए हैं क्योंकि javax.persistence.*;उपयोग किया जाता है और केवल org.hibernateबनाते समयSession, SessionFactory, and Configuration
मुशी

2
@ मुशी यह पूरी तरह सही है, क्योंकि क) प्रश्न हाइबरनेट के बारे में है, जेपीए के एक उल्लेख के बिना, और बी) मैं फिर भी स्पष्ट रूप से अपने उत्तर के दूसरे वाक्य में उल्लेख करता हूं कि जेपीए को डिफ़ॉल्ट बिल्डरों की आवश्यकता नहीं है, यहां तक ​​कि हाइबरनेट भी नहीं करता है।
माइक नाकिस

36

हाइबरनेट एक ओआरएम फ्रेमवर्क है जो फील्ड या प्रॉपर्टी एक्सेस की रणनीति का समर्थन करता है। हालांकि, यह कंस्ट्रक्टर-आधारित मैपिंग का समर्थन नहीं करता है - शायद आप क्या चाहते हैं? - जैसे कुछ मुद्दों के कारण

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();

और कुछ नहीं


1
इस प्रश्न के संबंध में मुझे अब तक का सबसे उत्कृष्ट विवरण मिला है। अधिकांश उत्तर मैंने पाया है कि इसमें किताबी तकनीकी शब्दों का इस्तेमाल किया गया है और किसी भी निकाय ने इसे आपके जैसे व्यवहार्य तरीके से नहीं समझाया है। आप को धन्यवाद और धन्यवाद!
डार्क नाइट

1
यह अच्छी तरह से हाइबरनेट टीम का तर्क हो सकता है। लेकिन वास्तविकता में, मुद्दों को हल किया जा सकता है (1) या तो एनोटेशन की आवश्यकता होती है, या केवल एक गैर-डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग कर रहा है यदि केवल एक कंस्ट्रक्टर है और (2) class.getDeclaredConstructors का उपयोग कर रहा है। और Class.newInstance () के बजाय Constructor.newInstance () का उपयोग करना। XML 8 में एक्सएमएल / एनोटेशन में उपयुक्त मैपिंग की जरूरत होगी, लेकिन यह पूरी तरह से संभव है।
ड्रोब

ठीक है, इसलिए हाइबरनेट डिफ़ॉल्ट कंस्ट्रक्टर से ऑब्जेक्ट बनाता है, और फिर यह खेतों के लिए सेटर का उपयोग करता है nameऔर age? यदि नहीं, तो यह बाद में किसी अन्य निर्माता का उपयोग करता है?
कोशिश 10

2
@tryingHard हां, एक बार त्वरित रूप से, हाइबरनेट सेटर या फ़ील्ड का उपयोग करता है - यह एक्सेस रणनीति पर निर्भर करता है। डिफ़ॉल्ट रूप से, आईडी एनोटेशन का स्थान डिफ़ॉल्ट एक्सेस रणनीति देता है। Docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/…
आर्थर रोनाल्ड

6

वास्तव में, आप उन कक्षाओं को तत्काल कर सकते हैं जिनमें कोई 0-आर्ग्स कंस्ट्रक्टर नहीं है; आप एक श्रेणी के निर्माणकर्ताओं की सूची प्राप्त कर सकते हैं, एक को चुन सकते हैं और इसे फर्जी मापदंडों के साथ लागू कर सकते हैं।

हालांकि यह संभव है, और मुझे लगता है कि यह काम करेगा और समस्याग्रस्त नहीं होगा, आपको सहमत होना पड़ेगा कि यह बहुत अजीब है।

हाइबरनेट जिस तरह से वस्तुओं का निर्माण करता है (मेरा मानना ​​है कि यह 0-arg कंस्ट्रक्टर को आमंत्रित करता है और फिर यह संभवतः उदाहरण के क्षेत्रों को सीधे परावर्तन के माध्यम से संशोधित करता है। शायद यह जानता है कि कैसे कॉल करने वाले को कॉल किया जाता है) एक वस्तु के निर्माण में माना जाता है के खिलाफ थोड़ा सा जाता है। जावा- उपयुक्त पैरामीटर के साथ कंस्ट्रक्टर को लागू करें ताकि नई वस्तु वह वस्तु हो जो आप चाहते हैं। मेरा मानना ​​है कि किसी वस्तु को तात्कालिक बनाना और फिर उसे बदलना कुछ हद तक "एंटी-जावा" है (या मैं कहूंगा, एंटी थ्योरिटिकल जावा) - और निश्चित रूप से, अगर आप प्रत्यक्ष क्षेत्र हेरफेर के माध्यम से ऐसा करते हैं, तो यह एनकैप्सुलेशन और सभी कि फैंसी एनकाउंटर सामान जाता है ।

मुझे लगता है कि ऐसा करने का उचित तरीका हाइबरनेट मैपिंग में यह परिभाषित करना होगा कि कैसे डेटाबेस को उचित तरीके से कंस्ट्रक्टर पंक्ति का उपयोग करते हुए जानकारी से इंस्टेंट किया जाना चाहिए ... लेकिन यह अधिक जटिल होगा - मतलब दोनों हाइबरनेट भी होंगे अधिक जटिल, मानचित्रण अधिक जटिल होगा ... और सभी अधिक "शुद्ध" होंगे; और मुझे नहीं लगता कि इससे वर्तमान दृष्टिकोण ("उचित तरीके" से काम करने के बारे में अच्छा महसूस करने के अलावा) पर एक फायदा होगा।

ऐसा कहने के बाद, और यह देखते हुए कि हाइबरनेट दृष्टिकोण बहुत "साफ" नहीं है, 0-arg कंस्ट्रक्टर के लिए बाध्यता सख्ती से आवश्यक नहीं है, लेकिन मैं कुछ हद तक आवश्यकता को समझ सकता हूं, हालांकि मेरा मानना ​​है कि उन्होंने विशुद्ध रूप से "उचित तरीके से" किया। "मैदान, जब वे" उचित तरीके से "(उचित कारणों के लिए यद्यपि) से बहुत पहले भटक गए।


5

हाइबरनेट को आपके प्रश्नों के परिणाम के रूप में उदाहरणों को बनाने की आवश्यकता है (प्रतिबिंब के माध्यम से), हाइबरनेट उस के लिए संस्थाओं के नो-आर्ग कंस्ट्रक्टर पर निर्भर करता है, इसलिए आपको नो-अर्ग कंस्ट्रक्टर प्रदान करने की आवश्यकता है। क्या स्पष्ट नहीं है?


एक privateकंस्ट्रक्टर गलत किन स्थितियों में है ? मैं अपनी जेपीए इकाई के लिए java.lang.InstantiationExceptionएक privateनिर्माता के साथ भी देख रहा हूं । संदर्भ
केविन मेरेडिथ 21

मैंने खाली कंस्ट्रक्टर के बिना क्लास की कोशिश की (लेकिन आर्ग्स कंस्ट्रक्टर के साथ) और यह काम कर गया। मुझे हाइबरनेट से जानकारी मिली "INFO: HHH000182: क्लास और क्लास के लिए कोई डिफॉल्ट (नो-तर्क) कंस्ट्रक्टर को इंटरसेप्टर द्वारा त्वरित किया जाना चाहिए", लेकिन डीबी से सफलतापूर्वक कोई अपवाद और वस्तु नहीं मिली।
लिजप डैम

2

परावर्तन के माध्यम से एक पैरामीटर रहित कंस्ट्रक्टर के साथ ऑब्जेक्ट बनाना बहुत आसान है, और फिर किसी पैरामीटरेड कॉन्ट्रैक्टर के अनियंत्रित मापदंडों को मनमाने ढंग से बदलने / नामकरण संघर्ष के साथ, कंस्ट्रक्टर के अंदर अपरिभाषित लॉजिक के साथ डेटा को मैच करने के बजाय, प्रतिबिंब के माध्यम से इसके गुणों को भरें। पैरामीटर किसी वस्तु, एट वगैरह के गुण मिलान नहीं करता है।

कई ओआरएम और धारावाहिकों को पैरामीटर रहित कंस्ट्रक्टर की आवश्यकता होती है, क्योंकि प्रतिबिंब के माध्यम से पैरामैटराइज्ड कंस्ट्रक्टर बहुत नाजुक होते हैं, और पैरामीटर रहित कंस्ट्रक्टर अनुप्रयोग को स्थिरता प्रदान करते हैं और डेवलपर के लिए ऑब्जेक्ट व्यवहार पर नियंत्रण रखते हैं।


मेरा तर्क है कि एक समृद्ध डोमेन ऑब्जेक्ट होने की आवश्यकता पर पूर्ण परिवर्तनशीलता के लिए अभी भी अधिक नाजुक हो सकता है (यह एक ORM से अधिक नहीं है यदि आपकी संस्थाओं को काम करने के लिए डेटा के बैग रहित बैग की आवश्यकता है - मैं यहां हूं क्योंकि मैं चाहता हूं एक कंस्ट्रक्टर लेकिन इसके बजाय रिच सेटर कॉल्स का अपरिभाषित क्रम है) ... लेकिन +1 क्योंकि आप स्वीकार करते हैं कि प्रतिबिंब
आरजीएस के

2

हाइबरनेट आलसी लोडिंग के लिए परदे के पीछे का उपयोग करता है। यदि आप एक कंस्ट्रक्टर को परिभाषित नहीं करते हैं या इसे निजी बनाते हैं तो कुछ चीजें अभी भी काम कर सकती हैं - जो कि प्रॉक्सी तंत्र पर निर्भर नहीं हैं। उदाहरण के लिए, क्वेरी API का उपयोग करके ऑब्जेक्ट को (बिना किसी कंस्ट्रक्टर के साथ) सीधे लोड करना।

लेकिन, यदि आप सेशन का उपयोग करते हैं, तो आप कंस्ट्रक्टर की अनुपलब्धता के कारण प्रॉक्सी जनरेटर लिब से इंस्टेंटेशन एक्सेप्शन का सामना करेंगे।

इस आदमी ने एक समान स्थिति की सूचना दी:

http://kristian-domagala.blogspot.com/2008/10/proxy-instantiation-problem-from.html


0

जावा भाषा युक्ति के इस खंड की जाँच करें जो स्थैतिक और गैर-स्थैतिक आंतरिक वर्गों के बीच अंतर को बताता है: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3

एक स्थिर आंतरिक वर्ग वैचारिक रूप से .java फ़ाइल में घोषित एक सामान्य सामान्य वर्ग से अलग नहीं है।

चूंकि हाइबरनेट को प्रोजेक्ट उदाहरण से स्वतंत्र रूप से ProjectPK को तत्काल करने की आवश्यकता होती है, ProjectPK को या तो एक स्थिर आंतरिक वर्ग होने की आवश्यकता होती है, या वह स्वयं .java फ़ाइल में घोषित की जाती है।

संदर्भ org.hibernate.InstantiationException: कोई डिफ़ॉल्ट निर्माता नहीं

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