2012-01-12 14 views
6

मैं persistence.xml फ़ाइल के अंदर पर्यावरण चर को पढ़ना चाहता हूं।persistence.xml फ़ाइल में पर्यावरण चर पढ़ें

आइडिया यह है कि मैं नहीं चाहता कि मेरा डेटाबेस विवरण गुण फ़ाइल से पढ़ा जाए क्योंकि गुण फ़ाइल ओवरराइड प्राप्त करने में कोई बदलाव है। इसके बजाय मैं पर्यावरण चर से विवरण पढ़ना चाहता हूं।

क्या इस मानदंड को प्राप्त करने का कोई तरीका है।

आईएएम स्प्रिंग 3 का उपयोग करके मेरा स्टैंडअलोन एप्लिकेशन यूनिक्स मशीन में तैनात किया जाएगा।

+2

होस्टनाम जैसे डेटाबेस विवरण को आपके persistence.xml में परिभाषित नहीं किया जाना चाहिए। जेएनडीआई लुकअप का प्रयोग करें और अपने एप्लिकेशन सर्वर में कंक्रीट डेटाबेस पैरामीटर को परिभाषित करें ... – home

+0

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

+0

क्या आप पर्यावरण चर से या persistence.xml से डेटाबेस विवरण प्राप्त करना चाहते हैं? ऐसा लगता है कि आप कह रहे हैं कि आप उन्हें दोनों से प्राप्त करना चाहते हैं लेकिन यह पूरी तरह स्पष्ट नहीं है ... –

उत्तर

5

आप मानचित्र की आपूर्ति करके एक स्थिरता इकाई में गुण अपडेट कर सकते हैं (this देखें)।

सुविधाजनक रूप से, पर्यावरण चर को मानचित्र के रूप में पुनर्प्राप्त किया जा सकता है (this देखें)।

दोनों को एक साथ रखें और आप गतिशील रूप से पर्यावरण चर के साथ अपनी दृढ़ता इकाई में गुणों को अपडेट कर सकते हैं।

संपादित करें: सरल उदाहरण ...

persistence.xml ...

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider> 
     oracle.toplink.essentials.PersistenceProvider 
    </provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="toplink.logging.level" value="INFO"/> 
     <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@myhost:l521:MYSID"/> 
     <property name="toplink.jdbc.password" value="tiger"/> 
     <property name="toplink.jdbc.user" value="scott"/> 
    </properties> 
</persistence-unit> 

कोड है कि अद्यतन वातावरण चर के साथ persistence.xml "डिफ़ॉल्ट" इकाई ...

Map<String, String> env = System.getenv(); 
Map<String, Object> configOverrides = new HashMap<String, Object>(); 
for (String envName : env.keySet()) { 
    if (envName.contains("DB_USER")) { 
     configOverrides.put("toplink.jdbc.user", env.get(envName)));  
    } 
    // You can put more code in here to populate configOverrides... 
} 

EntityManagerFactory emf = 
    Persistence.createEntityManagerFactory("default", configOverrides); 
+0

हाय जैक, मुझे यकीन नहीं है कि मैं persistence.xml पर मानचित्र कैसे प्रदान कर सकता हूं। क्या आप इसके लिए कुछ नमूना कोड प्रदान करते हैं। – Ran

+0

उदाहरण अपलोड किया गया - मुझे "दृढ़ता" googling द्वारा कुछ अच्छी जानकारी मिल रही है।एक्सएमएल " –

+0

हाय जैक, उपर्युक्त कोड के लिए मुझे एनवी वैरिएबल को ओवरराइड करने की आवश्यकता होती है जब भी मैं EntityManagerFactory ऑब्जेक्ट बना देता हूं। उस स्थिति में यदि मैं इस कक्षा का उपयोग कर रहा हूं, तो मुझे 10 वर्गों में प्रत्येक एंटीटी मैनेजर फैक्ट्री का उपयोग कर रहा हूं। – Ran

1

मुझे नहीं लगता कि यह इंजेक्शन के माध्यम से बनाए गए ईएम को कवर करेगा। इससे भी बदतर, मुझे लगता है कि ईएमएफ के माध्यम से बनाए गए ईएम केवल विस्तारित किए जा सकते हैं (उदाहरण के लिए एनोटेशन @ पर्सिस्टेंस कॉन्टेक्स्ट (टाइप = पर्सिस्टेंस कॉन्टेक्स्ट टाइप टाइप। ट्रान्सएक्शन) के बराबर के विपरीत) ताकि अगर किसी को लेनदेन ईएम की आवश्यकता हो, तो किसी को इंजेक्शन का उपयोग करना चाहिए।

मुझे आश्चर्य है कि क्या यह रनटाइम पर persistence.xml फ़ाइल को शारीरिक रूप से फिर से लिखना संभव है। समस्या यह है कि फ़ाइल को फिर से लिखने की क्षमता (अनुमतियां, मेटा-आईएनएफ आदि में इसे प्राप्त करने में सक्षम होने), और दूसरा, जेपीए द्वारा पहली बार खोला जाने से पहले इसे दोबारा लिखना (जो मुझे लगता है कि पहली बार इंजेक्शन ईएम होता है फ़ील्ड वास्तव में एप्लिकेशन कोड द्वारा संदर्भित है)

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