2012-07-27 14 views
8

सेट करना मान लें कि मेरे पास कनेक्शन url के साथ निम्नलिखित persistence.xml है, उपयोगकर्ता & पासवर्ड सभी हार्ड-कोड किए गए हैं।जेपीए दृढ़ता गुणों को गतिशील रूप से

निम्नलिखित हाइबरनेट 3.2 के लिए है। हाइबरनेट 3.5 ++ के लिए, हमें "hibernate.connection" को "javax.persistence" में बदलना होगा। लेकिन मुझे इस प्रश्न पूछने दें कि शाब्दिक "हाइबरनेट.कनेक्शन" या "जैवैक्स.परिस्टेंस" के बावजूद।

<persistence-unit name="obamacare" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
    <property name="hibernate.archive.autodetection" value="class, hbm"/> 
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/> 
    <property name="hibernate.connection.url" value="blah blah blah"/> 
    <property name="hibernate.connection.username" value="careuser"/> 
    <property name="hibernate.connection.password" value="carepass"/> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> 
    <property name="hibernate.show_sql" value="true"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

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

जहां तक ​​जेपीए का संबंध है, मैं इन जेपीए गुणों को गतिशील रूप से कैसे सेट कर सकता हूं? मैं जवाब के दो सेट की मांग कर रहा हूँ:

  1. एक समाधान जेपीए विक्रेता स्वतंत्र है (Toplink, eclipselink, हाइबरनेट, आदि) के लिए - वहाँ किसी भी जेपीए कार्यक्षमता है कि मुझे इन तीन गुण गतिशील निर्धारित करने की अनुमति होगी है?

  2. मैं संभव जेपीए केवल एवेन्यू के अलावा हाइबरनेट पर पूरी तरह से निर्भर करने के लिए, अनुमति है, वहाँ स्प्रिंग ढांचे (जो हर जगह जाल के साथ एक विशाल कुरूपता की तरह लगता है) को शामिल करने के बिना इस को प्राप्त करने के लिए एक रास्ता है?

मैं उत्तेजित हो जाएगा अगर आप भी दो सेंट में फेंक करना चाहते हैं/quids JNDI और मैं इसे कैसे इस्तेमाल कर सकते हैं persistence.xml गुण की कार्यक्षमता को बदलने के लिए पर/रुपए। हालांकि, यह सवाल की प्राथमिकता नहीं है।

+1

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

उत्तर

7

यह निर्भर करता है कि आप अपने EntityManagerFactory को बूटस्ट्रैप कैसे करते हैं। 2 spec परिभाषित विधियों में से प्रत्येक आपको java.util.Map के मैप में पास करने की अनुमति देता है। इन मानों को दृढ़ता-इकाई में परिभाषित मूल्यों पर प्राथमिकता लेनी चाहिए।

"एसई दृष्टिकोण" में कोई समस्या नहीं है क्योंकि बूटस्ट्रैप प्रक्रिया आमतौर पर आपके ऐप द्वारा नियंत्रित होती है: javax.persistence.Persistence#createEntityManagerFactory(String puName, Map config। अब आपको कुछ समस्याएं हो सकती हैं यदि कुछ और (अहम, वसंत) आपके लिए ईएमएफ "प्रबंधन" कर रहा है ...

"ईई दृष्टिकोण" में मुझे एक अच्छा वैश्विक दृष्टिकोण पता नहीं है। मानों का यह मानचित्र अभी भी बूटस्ट्रैपिंग में मौजूद है, लेकिन समस्या यह है कि ईई कंटेनर इस विधि को कॉल कर रहा है।

एक हाइबरनेट-विशिष्ट दृष्टिकोण जो किसी भी मामले में काम करेगा, कॉन्फ़िगर चर परिवर्तनीयता का उपयोग करना होगा। तो आपकी दृढ़ता-इकाई में आप ${some.key} का उपयोग कर उपयोगकर्ता नाम या पासवर्ड को परिभाषित करेंगे और हाइबरनेट आपके लिए उनको बदल देगा। चाहे यह वास्तव में काम करेगा, यह निर्भर करता है कि आप अंततः इन मूल्यों को कैसे सेट करना चाहते हैं; हाइबरनेट को अभी भी काम करने के लिए some.key नामक कॉन्फ़िगरेशन मान तक पहुंच की आवश्यकता है ...

फिर भी एक और "वैश्विक दृष्टिकोण" ... ईएमएफ बूटस्ट्रैप करने के लिए "ईई दृष्टिकोण" कंटेनर के लिए javax.persistence को तत्काल करने के लिए है। spi.PersistenceProvider और इसके javax.persistence.spi.PersistenceProvider # createContainerEntityManagerFactory को कॉल करें। createContainerEntityManagerFactory यहां एक दिलचस्प हस्ताक्षर है। अनिवार्य रूप से यह एक javax.persistence.spi पारित किया जाता है।PersistenceUnitInfo जो पार्स किए गए दृढ़ता इकाई और कुछ अन्य सामान का ऑब्जेक्ट प्रस्तुति है। एक विकल्प बूटस्ट्रैप के लिए इस दृष्टिकोण का उपयोग करना होगा और javax.persistence.spi.PersistenceUnitInfo के उदाहरण में पास करना होगा जिसे आप स्वयं बनाते हैं। javax.persistence.spi.PersistenceProvider एक इंटरफ़ेस है। इसे तुरंत चालू करने के लिए, आपको उस प्रदाता को जानना होगा जिसे आप उपयोग करना चाहते हैं और FQN को उनके इम्प्ल्यू में जाना है। लेकिन आमतौर पर यह कोई समस्या नहीं है क्योंकि ये बहुत अच्छी तरह से ज्ञात हैं।

आप विशेष रूप से जेडीबीसी कनेक्शन निर्माण/पूलिंग के बारे में पूछ रहे हैं। आपके पास विशेष रूप से अतिरिक्त विकल्प हैं। आप अपनी "क्रेडेंशियल सेवा" डेटा स्रोत बना सकते हैं और आपका जेपीए प्रदाता बस उस डेटासोर्स का उपयोग कर सकता है। सभी जेपीए प्रदाता JNDI लुकअप के माध्यम से डेटा स्रोतों का पता लगाने का समर्थन करते हैं। "ईई बूटस्ट्रैपिंग" प्रदाताओं में PersistenceUnitInfo # getJtaDataSource और/या PersistenceUnitInfo # getNonJtaDataSource के माध्यम से उपयोग करने के लिए डेटासोर्स भी पारित किया जा सकता है। हाइबरनेट वैकल्पिक डेटासोर्स जेएनडीआई नाम सेटिंग के स्थान पर वैकल्पिक रूप से डेटासोर्स उदाहरण स्वीकार करता है। यदि आप डेटासोर्स (कुछ अजीब कारणों के लिए) का उपयोग नहीं करना चाहते हैं, तो हाइबरनेट-विशिष्ट विकल्प हाइबरनेट के कनेक्शन प्रदाता अनुबंध को स्वयं लागू करना है, यह अनुबंध (इंटरफ़ेस) हाइबरनेट उपयोग करने के लिए जेडीबीसी कनेक्शन प्राप्त करने और रिलीज़ करने के लिए उपयोग करता है। कनेक्शन प्रदाता लागू करना आप अंतर्निहित कनेक्शन को किसी भी तरह से कॉन्फ़िगर कर सकते हैं।

विकल्पों में से बहुत सारे :)

+0

फिर भी एक और "वैश्विक दृष्टिकोण" ... ईएमएफ बूटस्ट्रैप करने के लिए "ईई दृष्टिकोण" javax.persistence.spi.PersistenceProvider को तुरंत चालू करना है और इसके javax.persistence.spi.PersistenceProvider # createContainerEntityManagerFactory को कॉल करना है। createContainerEntityManagerFactory यहां एक दिलचस्प हस्ताक्षर है। अनिवार्य रूप से यह एक javax.persistence.spi.PersistenceUnitInfo पारित किया जाता है जो पार्स किए गए दृढ़ता इकाई और कुछ अन्य सामान का ऑब्जेक्ट प्रतिनिधित्व है। विकल्प पर बूटस्ट्रैप के लिए इस दृष्टिकोण का उपयोग करना होगा और javax.persistence.spi.PersistenceUnitInfo में पास करना होगा कि आप अपना स्वयं का –

+0

अंतिम टिप्पणी में स्थान से बाहर निकलें :) javax.persistence.spi.PersistenceProvider एक इंटरफ़ेस है। इसे तुरंत चालू करने के लिए, आपको उस प्रदाता को जानना होगा जिसे आप उपयोग करना चाहते हैं और FQN को उनके इम्प्ल्यू में जाना है। लेकिन आमतौर पर यह कोई समस्या नहीं है क्योंकि ये बहुत अच्छी तरह से ज्ञात हैं। –

+0

स्टीव, आपके प्रयास के लिए धन्यवाद। क्या कोई मौका होगा कि आप अपनी टिप्पणियों को उत्तर क्षेत्र में स्थानांतरित कर सकें? $ {Some.key} प्रतिस्थापन विधि ठीक वही है जो मैं ढूंढ रहा हूं। क्या आप मुझे उदाहरण दे सकते हैं कि इसे हाइबरनेट के persistence.xml पर कैसे किया जाए। चूंकि हमारा उत्पादन बॉक्स jboss 4.x है, इसलिए हमें हाइबरनेट 3.2 के बजाय हाइबरनेट 3.2 का उपयोग करना होगा - इसलिए बहुत सी नई हाइबरनेट विशेषताएं लागू नहीं होती हैं। –

3

आपके दूसरे प्रश्न के लिए मैं एक हाइबरनेट-केवल समाधान प्रदान कर सकता हूं।

package dev.stackoverflow; 

import java.util.Properties; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class DynamicHibernateSessionFactory { 
    public Session setProperties(final String provider, 
           final Boolean excludeUnlisted, 
           final Properties properties) { 
     properties.setProperty("provider", provider); 
     properties.setProperty("exclude-unlisted-classes", excludeUnlisted.toString()); 
     Configuration configuration = new Configuration(); 
     configuration.setProperties(properties); 
     SessionFactory sessionFactory = configuration.configure().buildSessionFactory(); 
     return sessionFactory.openSession(); 
    } 
}