2012-09-07 21 views
6

मेरा वेब ढांचा (प्ले 1.2.5) एक ईजेबी 3 कॉन्फ़िगरेशन स्थानीय बनाता है जो इसे EntityManagerFactory(source) बनाने के लिए उपयोग करता है। मैं एक स्क्रिप्ट पर काम कर रहा हूं और एसक्यूएल स्क्रिप्ट बनाने के लिए कॉन्फ़िगरेशन से generateSchemaUpdateScript() विधि को चलाने के लिए चाहता हूं जिसे मैं सत्यापित कर सकता हूं और उत्पादन तैनाती पर चला सकता हूं। मेरी समस्या यह है कि मैं यह नहीं समझ सकता कि EntityManagerFactory के बाद कॉन्फ़िगरेशन ऑब्जेक्ट का उपयोग कैसे किया गया था या कॉन्फ़िगरेशन ऑब्जेक्ट कैसे उत्पन्न किया जाए।EntityManagerFactory के निर्माण के बाद मैं हाइबरनेट कॉन्फ़िगरेशन कैसे प्राप्त करूं?

+0

मैं डीबीए के साथ किसी भी स्कीमा उपकरण के बारे में बात करने का सुझाव दूंगा। वे आपके लिए स्कीमा कॉपी या स्क्रिप्ट प्रदान करने में सक्षम हो सकते हैं। – MarkOfHall

उत्तर

7

आप entitymanagerfactory से वापस विन्यास वस्तु नहीं मिल सकता है क्योंकि हाइबरनेट कार्यान्वयन EntityManagerFactoryImpl विन्यास वस्तु

आपके विकल्प

  • बनाने के लिए अपनी स्क्रिप्ट में JPAPlugin से कोड डुप्लिकेट हैं के लिए एक संदर्भ नहीं रखता है आपकी खुद की कॉन्फ़िगरेशन ऑब्जेक्ट
  • अपनी कक्षाओं पर काम करने के लिए हाइबरनेट टूल कॉन्फ़िगर करें। मैं इस उपकरण अपने आप इस्तेमाल कभी नहीं किया है, लेकिन मुझे लगता है कि है कि ठीक से विन्यस्त वह आप के लिए DDL उत्पन्न कर सकते हैं
  • अपने डेटाबेस
2

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

मैं 3.6.8 स्रोत हाइबरनेट की चर्चा करते हुए हूँ और EJB3Configuration वर्ग पद्धति के रूप में पदावनत के रूप में अपनी कार्यक्षमता के सभी विन्यास वर्ग के लिए ले जाया जाता है

public AnnotationConfiguration getHibernateConfiguration() { 
     //TODO make it really read only (maybe through proxying) 
     return cfg; 
    } 

AnnotationConfiguration घोषित किया जाता है है।

तो मुझे लगता है कि इसका उपयोग करके आप इसे बनाए जाने के बाद अपने कॉन्फ़िगरेशन में हैंडल प्राप्त कर सकते हैं। आपको उस कॉन्फ़िगरेशन में कुछ भी नहीं बदलने के बावजूद बहुत सावधान रहना होगा।

यह javadocs से समझाया गया है here

बाद #buildEntityManagerFactory() बुलाया गया है, आप अब विन्यास राज्य (कोई वर्ग को जोड़ने, कोई संपत्ति परिवर्तन आदि)

बदल सकते हैं

ऐसा करने के बाद, जो कुछ आप करने के लिए प्राप्त करने की कोशिश कर रहे हैं वह कुछ है जो विशेष रूप से को विशेष रूप से उत्पादन डेटाबेस पर नहीं जोड़ा गया है। देखें here

हाइबरनेट में "hibernate.hbm2ddl.auto" नाम की एक संपत्ति है जो स्क्रिप्ट विकसित करने के मामले में स्कीमा ऑटो पीढ़ी की सहायता करना है। आप प्रोग्रामेटिक रूप से प्राप्त करने की कोशिश कर रहे हैं समान प्रभाव इसे का मान अपने दृढ़ता xml में नीचे दिए गए मान के रूप में। वास्तव में कवर के तहत, जब उत्पन्न होता है तो विधि उत्पन्न होती है जब आप "hibernate.hbm2ddl" का मान रखते हैं तो कॉन्फ़िगरअप द्वारा कॉन्फ़िगर किया जाता है।ऑटो अपडेट "" करने के लिए सेट "

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      .................... 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      ...................... 
     </properties> 
    </persistence-unit> 
</persistence> 

आप इस विशेषता here

हालांकि हाइबरनेट डॉक्स stricltly उत्पादन डेटाबेस के खिलाफ इस का उपयोग कर के खिलाफ सलाह देता है के लिए अन्य संभावित मान देख सकते हैं।

पर निश्चित किताब हाइबरनेट "हाइबरनेट साथ जावा हठ" इस

चेतावनी हम हाय देखा है चेताते बर्नाट उपयोगकर्ता पर SchemaUpdate का उपयोग करने का प्रयास कर रहे हैं स्वचालित रूप से उत्पादन डेटाबेस की स्कीमा अपडेट करें। यह आपदा में जल्दी समाप्त हो सकता है और आपके डीबीए द्वारा इसकी अनुमति नहीं दी जाएगी।

और भी अद्यतन स्कीमा प्रक्रिया के बारे में कुछ सीमाएं

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

अद्यतन 1: आप EJB3Configuration के लिए उपयोग नहीं है, तो और अपने अंतिम लक्ष्य तो आप प्रोग्राम एक हठ का उपयोग कर एक जावा मुख्य वर्ग में EJB3Configuration बना सकते हैं जेपीए एनोटेट संस्थाओं के लिए अद्यतन स्कीमा स्क्रिप्ट बनाने के लिए है xml फ़ाइल जिसमें आपके डेटाबेस का कॉन्फ़िगरेशन विवरण होता है और स्कीमा निर्यात उपकरण चलाता है। this उदाहरण देखें कि आप इसे कैसे कर सकते हैं। तो इस तरह आप अपने ढांचे या कंटेनर के बाहर जेपीए इकाइयों पर टूल चला सकते हैं।

अद्यतन 2

उदाहरण कोड सूचीबद्ध here चलता जब खेल अनुप्रयोगों के लिए डेटाबेस माइग्रेशन बनाने कैसे आप हाइबरनेट स्कीमा अद्यतन इस्तेमाल कर सकते हैं। ऐसा लगता है कि आप यही चाहते थे!

+1

मेरे नियंत्रण से बाहर के कारणों के लिए, मेरे पास EJB3 कॉन्फ़िगरेशन इंस्टेंस तक पहुंच नहीं है, इसलिए मैं उस से कॉन्फ़िगरेशन नहीं ले सकता। मैं आपकी अतिरिक्त सलाह से सहमत हूं, मेरी वर्तमान योजना जेनरस्केमा अपडेटस्क्रिप्ट() को मेरे विकास डेटाबेस के विरुद्ध चलाने और अद्यतन एसक्यूएल में जांचना था और इसे सत्यापित करने के बाद मेरे डीबीए को चलाने देना था। –

+0

अगर यह मदद करता है तो ऊपर दिए गए मेरे अपडेट देखें! – Shailendra

+0

मैंने "अद्यतन 2" अनुभाग में एक लिंक जोड़ा है जो ऐसा लगता है जो आप करना चाहते हैं! – Shailendra