2012-01-12 36 views
6

我想讀取persistence.xml文件中的環境變量。讀取persistence.xml文件中的環境變量

想法是我不希望我的數據庫詳細信息從屬性文件中讀取,因爲有一個獲取屬性文件覆蓋的變化。而我想從環境變量中讀取詳細信息。

有什麼辦法可以達到這個標準。

Iam使用Spring 3我的獨立應用程序將部署在unix機器上。

+2

不應在persistence.xml中定義像hostname這樣的數據庫詳細信息。使用JNDI查找並在您的應用程序服務器中定義具體的數據庫參數... – home 2012-01-12 14:41:54

+0

嗨,對不起,我沒有在這裏使用任何應用程序服務器,我正在運行獨立的應用程序,這就是爲什麼我需要在persistence.xml文件中硬編碼數據庫的詳細信息。 – Ran 2012-01-12 14:49:50

+0

是否想從環境變量或persistence.xml中獲取數據庫詳細信息?這看起來像你說你想從兩者中得到它們,但它不完全清楚...... – 2012-01-12 14:56:48

回答

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 2012-01-13 07:00:11

+0

已上傳示例 - 我一直在通過Google搜索「持久性」找到一些很好的信息。xml「 – 2012-01-13 10:48:44

+0

嗨Zack,上面的代碼要求我每次創建EntityManagerFactory對象時都要覆蓋env變量。在這種情況下,如果我在10個類中使用此EntityManagerFactory,則需要更改每個位置。 – Ran 2012-01-13 11:46:55

1

我不認爲這將覆蓋通過注射創建的EMs。更糟糕的是,我認爲通過EMF創建的EM只能是EXTENDED(例如等同於與EXTENDED相對的註解@PersistenceContext(type = PersistenceContextType.TRANSACTION)),因此如果需要事務EM,則必須使用注入。

我想知道,如果可能的身體在運行時重寫persistence.xml文件。問題之一是,重寫文件的能力(權限,能夠在META-INF中得到它),第二,在JPA首次打開之前重寫它(我首先想到的是一個注入的EM字段實際上是由應用程序代碼引用的)