java - सीतनिद्रा में होना और स्प्रिंग लेनदेन-निजी कन्स्ट्रक्टरों/स्थिर कारखाने के तरीकों का उपयोग करना




hibernate spring (3)

हमारे पास हाइबरनेट / स्प्रिंग अनुप्रयोग है जिसमें निम्नलिखित स्प्रिंग बीन्स हैं:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" />

जब हम एक साथ वायरिंग करते हैं, तो हमारे सीतनिद्रा में होने वाली संस्थाओं में निजी कन्स्ट्रक्टर का उपयोग करते समय हम निम्नलिखित त्रुटि प्राप्त करते हैं:

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No visible constructors in class 'ourclass'

संस्थाएं विशिष्ट डोमेन वस्तुएं जैसे कि किसी कर्मचारी या समान हैं

जब संकुल (या सार्वजनिक) के लिए कंस्ट्रक्टर की दृश्यता संशोधक को बदलते हैं, तो एप्लिकेशन ठीक चलता है और संस्थाओं को डाटाबेस में जमा / लोड किया जाता है। स्प्रिंग / हाइबरनेट लेनदेन प्रबंधन के साथ हम निजी कन्स्ट्रक्टर / स्टैटिक फ़ैक्टरी तरीके कैसे इस्तेमाल कर सकते हैं?

संस्थाओं / संबंधों को मैप करने के लिए हम हाइबरनेट एनोटेशन का उपयोग करते हैं। समस्या से संबंधित डोमेन वर्ग के लिए applicationContext.xml में कोई बीन परिभाषाएं घोषित नहीं की जाती हैं। यह एक कवि है जिसमें एक स्थिर कारखाना विधि और एक निजी कन्स्ट्रक्टर होना चाहिए।

कैसे हम सीतनिद्रा में होना (org.springframework.spring-orm.hibernate3 वर्गों मुझे लगता है) बनाने के बजाय कन्स्ट्रक्टर के बजाय स्थिर कारखाने विधि का उपयोग कर सकते हैं? या संभवत: यदि आवश्यक हो तो इसे निजी कंस्ट्रक्टर कहें?

स्प्रिंग फैक्टरी-विधि कॉन्फ़िगरेशन का उपयोग करना समझदारी होगी, लेकिन संस्थाओं को हमारे आवेदन में एक्सचेंज के रूप में मैप नहीं किया जाता है। Context.xml हाइबरनेट हठ के लिए @ एंटीटी एनोटेशन के साथ उनका केवल एनोटेट किया गया है।

उम्मीद है कि यह संपादन स्पष्ट करता है (सवाल को mystifies के बजाय) :)


क्या आप संपत्ति "कारखाने-विधि" के बारे में जानते हैं? आप एक सेम को इन्स्तांत करने के लिए कन्स्ट्रक्टर के बजाय स्प्रिंग कॉल की विधि बना सकते हैं।


मुझे नहीं लगता है कि आप सीतनिद्रा में होना (या कोई बाहरी ढांचा) अपने ऑब्जेक्ट पर एक निजी कन्स्ट्रक्टर को बुला सकते हैं, जब तक यह कुछ javassist या cglib रनटाइम बनाया उप-वर्ग के माध्यम से नहीं है

यदि आप हाइबरनेट को अपने कन्स्ट्रक्टर को कॉल करना चाहते हैं, तो आप इसे public या package क्यों नहीं बनाते हैं? हाइबरनेट डिफ़ॉल्ट ऑल-कन्स्ट्रक्टर को कॉल करके अपने ऑब्जेक्ट को इन्स्तांत करता है। प्रलेखन बताता है कि आपके कक्षाओं में पैकेज या सार्वजनिक दृश्यता के साथ डिफ़ॉल्ट कोई-आर्ग कन्स्ट्रक्टर होना चाहिए। आपकी कक्षाएं final नहीं होनी चाहिए क्योंकि संघटन का उपयोग करते समय सीतनिद्रा में होना उनके लिए प्रॉक्सी बनाता है।


हालांकि मैंने स्प्रिंग का इस्तेमाल नहीं किया है, मैंने हाइबरनेट का इस्तेमाल एक ऐसे प्रोजेक्ट में किया है, जिसमें कक्षाएं हैं, जो कि कारखाने के तरीकों या एकाधिक तर्क कंस्ट्रक्टरों के जरिये तत्काल शुरू होनी चाहिए।

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

हाइबरनेट ऑब्जेक्ट को तत्काल बनाने के अपने तरीके का उपयोग करने के लिए, ऐसा कुछ करें:

public class MyInterceptor extends EmptyInterceptor {

    public Object instantiate(String entityName, EntityMode entityMode, Serializable id) {
        if(entityName.equals(Foo.class.getName())
             return Foo.create();
        return null;
    }
}

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





transactions