2013-10-03 64 views
9

編輯:not duplicate but almost的persistence.xml來導入的.properties數據庫的參數值文件

我想有我的應用程序的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="appName" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="${db.dialect'}"/> 
      <property name="javax.persistence.jdbc.driver" value="${db.driver}"/> 
      <property name="javax.persistence.jdbc.user" value="${db.user}"/> 
      <property name="javax.persistence.jdbc.password" value="${db.password}"/> 
      <property name="javax.persistence.jdbc.url" value="${db.url}"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

從一個簡單的獲得這些佔位符值文本文件在我的源文件夾中的某處。

我讀到它使用Spring的時候做這樣

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:com/foo/jdbc.properties</value> 
    </property> 
</bean> 

但在這裏我們不使用Spring,Hibernate的只是一些Primefaces是可能的。

可能嗎?

謝謝!

編輯:我沒有提到一些事情,但作爲參考,我也使用Shiro Security和Ant來做一些事情。我將發佈解決方案作爲答案。這使得我的項目有數據庫參數3個不同的文件:

  • 的persistence.xml(休眠)
  • 的context.xml(四郎)
  • database.properties(對螞蟻遷飛任務)

回答

1

我編輯提我使用四郎安全,叔帽子也需要一些數據庫參數。我讓它只需要1個數據庫參數位置,這些位置在context.xml中保持不變,並在其他文件中引用它。

1)螞蟻讀取的context.xml

context.xml中具有

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <!-- Other stuff... --> 

    <!-- Shiro's --> 
    <Resource name="jdbc/postgres" auth="Container" 
     type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" 
     url="jdbc:postgresql://url-to-db/database" 
     username="user" password="pass" /> 
</Context> 

使用的Ant build.xml

<xmlproperty file="/path/to/context.xml" keepRoot="false" semanticAttributes="true" includeSemanticAttribute="true" /> 

並然後訪問它使用

<target name="init-flyway"> 
    <property name="flyway.url" value="${Resource.url}" /> 
    <property name="flyway.user" value="${Resource.username}" /> 
    <property name="flyway.password" value="${Resource.password}" /> 
    <!-- stuff stuff stuff --> 
</target> 

2)persistence.xml閱讀上下文。XML

有可能使用this

<non-jta-data-source>java:/comp/env/jdbc/postgres</non-jta-data-source> 

所以,我殺了3個數據庫參數只是1

感謝您的幫助使用上下文的數據存儲!

2

如果您使用Maven作爲構建系統,則可以使用Maven過濾器在構建期間替換這些值。

或者你可以寫一個簡單的屬性佔位符代替(這是內部使用彈簧本身)

參考:https://stackoverflow.com/a/14724719/477435

+0

其實我們使用Ant來構建它。對不起,但我想我誤解了......你是否建議使用Java類來將值放在一些佔位符上? – paulochf

+0

我實際上是指使用Java類,它可以通過讀取屬性文件來替換佔位符值。但是他建議的下面的答案要好得多,你可以不使用persistence.xml,只使用屬性文件。 – Gireesh

15

相反的定義裏面persistence.xml的屬性,你可以在一個標準的屬性文件中定義它們(鍵=值),並通過一個Properties對象到createEntityManagerFactory()方法,例如:

Properties props = new Properties(); 
props.load(new FileInputStream("/some/path/persistence.properties")); 
EntityManagerFactory factory = Persistence.createEntityManagerFactory("appName", props); 
+0

只要提一下,如果我沒有找到我的解決方案,我一定會使用這個。 – paulochf

+4

只是一個提醒。在屬性文件中,請記住使用整個屬性名稱,例如「javax.persistence.jdbc.user」,而不是「用戶」 – McCoy

+0

爲什麼哦爲什麼我沒有找到這個之前 –