2013-02-13 24 views
6

के भीतर से hibernate.connection.url बदलें मैं वसंत के साथ संयोजन में हाइबरनेट का उपयोग कर रहा हूं। डेटाबेस के रूप में मैं वर्तमान में एचएसक्यूएल का उपयोग कर रहा हूं, जो फ़ाइल में अपने डेटा को संग्रहीत करता है (जैसे SQLite)। HSQL फ़ाइल का पथ वर्तमान में persistence.xml में हार्ड-कोड किया गया है। मैं रनटाइम पर इस मान को कैसे एक्सेस और बदल सकता हूं, इसलिए कोई उपयोगकर्ता किसी मनमानी HSQL फ़ाइल से लोड/सहेज सकता है?वसंत

persistence.xml:

<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_1_0.xsd" 
      version="1.0"> 

    <persistence-unit name="something-unit"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <properties> 
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> 
      <property name="hibernate.connection.url" value="jdbc:hsqldb:file:~/something-db/somethingdb" /> 
      <property name="hibernate.connection.username" value="sa" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
     </properties> 
    </persistence-unit> 

</persistence> 

स्प्रिंग applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:data="http://www.springframework.org/schema/data/jpa" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-2.5.xsd 
       http://www.springframework.org/schema/data/jpa 
       http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 


    <!-- Database Setup --> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="something-unit" /> 
    </bean> 

    <data:repositories base-package="com.something.playlist"/> 

    <!-- Transaction Setup --> 

    <tx:annotation-driven/> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

</beans> 

किसी भी संकेत के लिए धन्यवाद!

+0

ने एक बाउंटी जोड़ा क्योंकि मुझे इसके साथ एक ठोस उदाहरण/अधिक सहायता चाहिए। –

उत्तर

3

आप एक जेएनडीआई डेटासोर्स निर्दिष्ट कर सकते हैं और इसे हाइबरनेट में भेज सकते हैं। या आप अधिक संकेत के लिए इंटरफ़ेस org.hibernate.connection.ConnectionProvider

को लागू करने से JDBC कनेक्शन प्राप्त करने के लिए अपने स्वयं के प्लगइन रणनीति को परिभाषित कर सकते देखें: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

संपादित 2/16: एक उदाहरण है StackOverflow पर एक कस्टम कनेक्शनप्रदाता बनाने पर: How can I set Datasource when I'm creating Hibernate SessionFactory?

यदि आप स्टार्टअप के बजाए फ्लाई पर डेटा स्रोत बदलने जा रहे हैं, तो आपको हाइबरनेट सत्र कारखाना को पुनरारंभ करना होगा। इसे सही तरीके से करने के लिए, आपको यह सुनिश्चित करना होगा कि पुनरारंभ के समय इसमें कोई लेन-देन नहीं चल रहा है। प्रश्न/उत्तर के बाद आपको लगता है कि साथ में मदद मिलेगी: Hibernate Sessionfactory restart | Spring

+0

शायद आप बक्षीस में शामिल होना चाहते हैं? ;-) –

+0

मैंने कुछ संदर्भ जोड़े हैं। उम्मीद है कि यह आपको या किसी को मदद करता है जो बक्षीस के लिए पूर्ण समाधान लिखता है। सौभाग्य! – Olaf

1

एक आमतौर पर इस्तेमाल किया रणनीति एक या कई * .properties फ़ाइलों में सभी क्रम विन्यास को परिभाषित करने और मूल्यों लोड करने के लिए वसंत के PropertyPlaceholderConfigurer का उपयोग करें और applicationContext.xml में प्लेसहोल्डर विकल्प है, यहां और पढ़ें: Best ways to deal with properties values in XML file in Spring, Maven and Eclipses

app.properties:

# Dadabase connection settings: 
hibernate.connection.driver_class=org.hsqldb.jdbcDriver 
hibernate.connection.url=jdbc:hsqldb:file:~/something-db/somethingdb 
hibernate.connection.username=sa 
hibernate.connection.password=changeit 
hibernate.dialect=org.hibernate.dialect.HSQLDialect 
hbm2ddl.auto=update 
... ... 

applicationContext-dataStore.xml:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <!-- Default location inside war file --> 
     <value>classpath:app.properties</value> 
     <!-- Environment specific location, a fixed path on deployment server --> 
     <value>file:///opt/my-app/conf/app.properties</value> 
    </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true"/> 
</bean> 

... ... 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${hibernate.connection.driver_class}" /> 
    <property name="url" value="${hibernate.connection.url}" /> 
    <property name="username" value="${hibernate.connection.username}" /> 
    <property name="password" value="${hibernate.connection.password}" /> 
</bean> 

एक समस्या यह है यहाँ PropertyPlaceholderConfigurer persistence.xml पार्स नहीं करता है, समाधान सभी हाइबरनेट विन्यास स्थानांतरित करने के लिए है स्प्रिंग के अनुप्रयोग Context.xml में, क्योंकि उन्हें persistence.xml में सेट करना आवश्यक नहीं है। यहां और पढ़ें: loading .properties in spring-context.xml and persistence.xml

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<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_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="JPAService" transaction-type="RESOURCE_LOCAL"/> 
</persistence> 

applicationContext-datSource.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${hibernate.connection.driver_class}"/> 
    <property name="url" value="${hibernate.connection.url}"/> 
    <property name="username" value="${hibernate.connection.username}"/> 
    <property name="password" value="${hibernate.connection.password}"/> 
</bean> 

... ... 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath:./META-INF/persistence.xml"/> 
    <property name="persistenceUnitName" value="JPAService"/> 
    <property name="dataSource" ref="dataSource"/> 

    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="${hibernate.dialect}"/> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="true"/> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
    <!-- set extra properties here, e.g. for Hibernate: --> 
    <props> 
     <prop key="hibernate.hbm2ddl.auto">${hbm2ddl.auto}</prop> 
    </props> 
    </property> 
</bean> 

ध्यान दें कि वेब अनुप्रयोग हर बार जब आप/opt/मेरी-एप्लिकेशन में कॉन्फ़िगरेशन परिवर्तन पुन: प्रारंभ करना /conf/app.properties, परिवर्तन करने के लिए प्रभावी होने के लिए।

उम्मीद है कि इससे मदद मिलती है।

+0

यॉर्कवर्क, उस विस्तृत उत्तर के लिए धन्यवाद। लेकिन अगर मैं आपको सही समझता हूं, तो मैं आपके समाधान का उपयोग करके फ्लाई पर हाइबरनेट.कनेक्शन.यूआरएल नहीं बदल सकता? मुझे वास्तव में इसे फ्लाई पर बदलने की जरूरत है, इसलिए कोई उपयोगकर्ता उदा। फ़ाइल - खोलें और फिर एक फ़ाइल का चयन करें जिसमें एक HSQL डेटाबेस शामिल है। क्या आपको इस पर कोई संकेत है? धन्यवाद :-) –

1

यदि आप जेपीए एब्स्ट्रक्शन के माध्यम से हाइबरनेट का उपयोग करना चाहते हैं तो आप javax.persistence.EntityManagerFactory का उपयोग करने के लिए अपना कोड या सेवा लिख ​​सकते हैं।इनमें से एक को स्वचालित करें और createEntityManager (मानचित्र मानचित्र) पर कॉल करें; आप मानचित्र में डेटास्रोत प्रदान कर सकते हैं। आप इकाई प्रबंधक को अपने कार्यान्वयन के साथ लपेट सकते हैं जो डेटा स्रोत बनाने के लिए थ्रेड-लोकल से पैरामीटर खींचता है।

संपादित करें: संदर्भ को गलत पढ़ें और देखा कि आप EntityManagerFactory का उपयोग कर रहे हैं। इस मामले में केवल अंतिम भाग पढ़ें जहां आप फैक्ट्री को ऐसे प्रतिनिधि के साथ लपेटते हैं जो थ्रेडलोकल से सही डेटास्रोत बनाता है।