我想讀取persistence.xml文件中的環境變量。讀取persistence.xml文件中的環境變量
想法是我不希望我的數據庫詳細信息從屬性文件中讀取,因爲有一個獲取屬性文件覆蓋的變化。而我想從環境變量中讀取詳細信息。
有什麼辦法可以達到這個標準。
Iam使用Spring 3我的獨立應用程序將部署在unix機器上。
我想讀取persistence.xml文件中的環境變量。讀取persistence.xml文件中的環境變量
想法是我不希望我的數據庫詳細信息從屬性文件中讀取,因爲有一個獲取屬性文件覆蓋的變化。而我想從環境變量中讀取詳細信息。
有什麼辦法可以達到這個標準。
Iam使用Spring 3我的獨立應用程序將部署在unix機器上。
可以通過提供一個地圖(見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);
我不認爲這將覆蓋通過注射創建的EMs。更糟糕的是,我認爲通過EMF創建的EM只能是EXTENDED(例如等同於與EXTENDED相對的註解@PersistenceContext(type = PersistenceContextType.TRANSACTION)),因此如果需要事務EM,則必須使用注入。
我想知道,如果可能的身體在運行時重寫persistence.xml文件。問題之一是,重寫文件的能力(權限,能夠在META-INF中得到它),第二,在JPA首次打開之前重寫它(我首先想到的是一個注入的EM字段實際上是由應用程序代碼引用的)
不應在persistence.xml中定義像hostname這樣的數據庫詳細信息。使用JNDI查找並在您的應用程序服務器中定義具體的數據庫參數... – home 2012-01-12 14:41:54
嗨,對不起,我沒有在這裏使用任何應用程序服務器,我正在運行獨立的應用程序,這就是爲什麼我需要在persistence.xml文件中硬編碼數據庫的詳細信息。 – Ran 2012-01-12 14:49:50
是否想從環境變量或persistence.xml中獲取數據庫詳細信息?這看起來像你說你想從兩者中得到它們,但它不完全清楚...... – 2012-01-12 14:56:48