2009-10-02 9 views
6

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

उत्तर

10

यह गतिशील रूप से किया जा सकता है, लेकिन यह कुछ हद तक गंदा है:

आप गतिशील हाइबरनेट के विन्यास वस्तु को बदलने के लिए पहले SessionFactory बनाया गया है की आवश्यकता होगी। यदि आप वसंत का उपयोग कर रहे हैं, तो AnnotationSessionFactoryBean की विधि को ओवरराइड करके किया जा सकता है; अन्यथा आपको buildSessionFactory() पर आक्रमण करने से पहले अपने कॉन्फ़िगरेशन ऑब्जेक्ट का उपयोग करके इसे करने की आवश्यकता होगी।

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

आप configuration.getMappings() के माध्यम से कक्षा/तालिका मैपिंग तक पहुंच प्राप्त कर सकते हैं। इसके बाद आपको Table API के माध्यम से एक नया टेबल मैपिंग बनाने की आवश्यकता होगी और इसे addTable() के माध्यम से कॉन्फ़िगरेशन में जोड़ें। उसी चीज को PersistentClass के साथ किया जाना चाहिए जो क्लास मैपिंग का प्रतिनिधित्व करता है। यदि आप एकाधिक इकाइयों का प्रतिनिधित्व करने के लिए एक ही कक्षा का उपयोग कर रहे हैं (उदा। एकाधिक टेबल मैप करें) प्रत्येक के लिए अद्वितीय इकाई नामों का उपयोग करना सुनिश्चित करें। आपको प्रत्येक ऐप को पुनरारंभ करने पर यह करना होगा (कॉन्फ़िगरेशन को बदलें)।

2

कितनी तालिकाओं गतिशील रूप से बनाई गई हैं? क्या टेबल समान हैं और आप बस डेटाबेस नाम बदलते हैं? किसी दृश्य पर http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html

आप पूरी तरह से एक नई तालिका का निर्माण कर रहे हैं, तो आप एक दृश्य का उपयोग कर सकते हैं और सिर्फ प्रत्यक्ष लोग:

यहाँ तालिका नाम बदलने का एक चर्चा है?

जेडीबीसी में केवल गतिशील रूप से प्रश्न बनाने के बजाय, आप इसके लिए हाइबरनेट का उपयोग क्यों कर रहे हैं?

+0

मैं सहमत हूं कि इस समस्या के लिए हाइबरनेट का उपयोग करना सही नहीं है। – sbidwai

0

डेटाबेस समाधान - आप एक दृश्य बना सकते हैं और इसे एक तालिका या दूसरे पर इंगित कर सकते हैं (माना जाता है कि संरचना समान है)।

लेकिन इस रूप में चुनें * देखें HIBERNATE_NAME बनाएं TABLE_A

से

या बनाएँ देखें HIBERNATE_NAME रूप चुनें * TABLE_B

से

आप देशी एसक्यूएल (DDL) निष्पादित करने के लिए आप आवेदन की आवश्यकता होगी, हाइबरनेट हैक्स से आसान होना चाहिए

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