2011-12-27 6 views
5

मेरे पास एक MySQL डेटाबेस है जो मैं डेटाबेस में एक नई तालिका जोड़ने की कार्यक्षमता जोड़ना चाहता हूं। मैं शायद इसके लिए जेपीक्यूएल का उदाहरण आसानी से पा सकता हूं लेकिन फिर मैं इस नई तालिका के लिए स्वचालित रूप से इकाई कैसे उत्पन्न करूं ताकि मैं इसे अपने शेष जेपीए कोड में तालिका से अद्यतन और हटाने के लिए संदर्भित कर सकूं, आमतौर पर मैं इकाई को संदर्भित करता हूं वास्तविक तालिका स्वयं नहीं।जावा ईई/जेपीए डेटाबेस डेटाबेस में नई टेबल/इकाइयों को जोड़ने के लिए

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

उत्तर

7

गतिशील रूप से नई तालिकाओं को बनाना और मैप करना कुछ ऐसा नहीं है जो जेपीए का समर्थन करता है। इसे फ्लाई पर नई जावा कक्षाएं बनाने की आवश्यकता होगी और मैपिंग मेटाडेटा को गतिशील रूप से अपडेट करना होगा। आप जेडीबीसी या मूल प्रश्नों के साथ जो कुछ भी चाहते हैं वह कर सकते हैं। लेकिन शायद आपको समझाया जाना चाहिए कि आपको फ्लाई पर नई टेबल बनाने की आवश्यकता क्यों है।

+0

मुझे नहीं पता कि मुझे अक्सर टेबल बनाने की आवश्यकता होगी। मुझे लगता है कि यदि आप अपनी स्कीमा सही तरीके से बनाते हैं तो आपको नई टेबल बनाना होगा। लेकिन अगर हमने किया तो मैं हमेशा सर्वर प्रोजेक्ट को पुनर्निर्माण और नए मैपिंग के साथ तैनात कर सकता हूं। मैं सिर्फ यह जानना चाहता था कि यह संभव था क्योंकि किसी ने पूछा कि क्या मैं इसे कर सकता हूं। – Randnum

+0

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

+0

अच्छा बिंदु। हालांकि मुझे लगता है कि कम से कम उस प्रश्न के लिए जो मुझे लाया गया था, ये तालिकाओं रिश्ते और चाबियों के बिना अन्य तालिकाओं से स्वतंत्र होंगे।लेकिन संस्थाओं को उत्पन्न करने के लिए मुझे फिर से तैनात करना होगा ताकि यह अभी भी एक बुरा विचार होगा। – Randnum

1

आप सर्वर स्टार्टअप पर डीबी अद्यतन करने के लिए अपने हाइबरनेट गुण या persistence.xml को कॉन्फ़िगर कर सकते हैं। यह स्वचालित रूप से टेबल अपडेट करेगा। हाइबरनेटडिएलेक्ट पैरामीटर के बगल में देखें।

<property name="hibernate.hbm2ddl.auto" value="update" /> 

वह है जो आप चाहते हैं। मुझे नहीं लगता कि आप फ्लाई पर इकाई कक्षाएं बनाना चाहते हैं और @JB निजेट के जवाब में पुन: नियोजित किए बिना तालिकाओं को बनाना चाहते हैं।

3

टेबल बनाने के कुछ तरीके हैं। उत्पादन के उपयोग के लिए सबसे आम यह है कि डीबीए (या उस भूमिका में डेवलपर) आवेदन की स्वतंत्र रूप से डेटाबेस स्कीमा (टेबल इत्यादि) बनाता है।

यह सामान्य है, क्योंकि एप्लिकेशन डेटाबेस में डेटा को मॉडल करता है, और एक सामान्य ज्ञान है जो कहता है कि डेटाबेस सामान्य रूप से एप्लिकेशन को बहिष्कृत करता है।

जेपीए प्रदाता स्वचालित रूप से स्कीमा बनाने देना संभव है। जेपीए एनोटेशन पर विशेष रूप से इस उद्देश्य के लिए कुछ विशेषताओं हैं (उदा। nullable विशेषता JoinColumn)।

यह सक्रिय करना persistence.xml में प्रदाता विशिष्ट गुणों के साथ होता है। जैसे EclipseLink (जैसा कि ग्लासफ़िश में उपयोग किया जाता है) के लिए hibernate.hbm2ddl.auto हाइबरनेट (जैसा कि जेबॉस एएस में उपयोग किया जाता है) और eclipselink.ddl-generation के लिए।

कुछ उदाहरणों के लिए http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss देखें।

तालिका में एक इकाई डालने एक पूरी तरह से अलग बात है। आपके प्रश्न से किसी भी तरह यह महसूस हो रहा है कि आप उन दोनों के बीच अंतर को पूरी तरह से समझ नहीं सकते हैं। यह उदाहरण के माध्यम से होता है EntityManager#persist, लेकिन अगर आप यही पूछ रहे हैं तो मैं 100% निश्चित नहीं हूं।