2012-02-16 131 views
1

我在寫一個必須訪問不同數據庫的Java SE(桌面)應用程序,它們將具有相同的數據模型(相同的模式,表等)。我想重用已在每個數據庫前面的Java EE應用程序中使用的JPA實體。如何讓JPA應用程序訪問不同的數據庫?

要重新使用現有的entity.jar文件,我必須使用具有resource_local數據源的不同persistence.xml對其進行重新打包。這是造成時間不便,但不是一個大問題。

問題是我的桌面應用程序將僅限於使用persistence.xml文件中定義的數據源。我可以定義多個持久性單元並選擇在運行時使用哪個單元,但是當添加新數據庫時,必須更改persistence.xml並更新所有桌面二進制文件。

我希望能夠在每個用戶可以配置的.properties文件中定義新的數據源。有什麼方法可以在運行時重寫或添加到persistence.xml中聲明的持久單元嗎?

我不想用Web服務接口來構建Java EE應用程序來支持此桌面應用程序。 Java EE應用程序有不同的用途,我想在桌面應用程序中保留桌面功能。

謝謝。

回答

5

您可以通過提供屬性在運行時創建EntityManagerFactory。你

Map<String, Object> properties = new HashMap<String, Object>(); 

properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name()); 
properties.put(JDBC_DRIVER, driver); 
properties.put(JDBC_URL, db_url); 
properties.put(JDBC_USER, "userName"); 
properties.put(JDBC_PASSWORD, "password"); 

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PERSISTENT_UNIT_NAME", properties); 

也可以嘗試具有從屬性將在運行時加載到地圖屬性文件。因此它將從代碼中分離數據庫配置。

編輯:屬性鍵(JDBC_URL等)是供應商特定的,它們應該相應地被替換。

+0

謝謝。我接受你的答案,並在上面進行擴展。 – 2012-02-22 17:32:26

+0

@DeanSchulze不客氣,很高興幫助。 – 2012-02-22 18:48:42

3

Nayan,

我需要擴展您的答案,因爲它不完整。

有關使用性能動態創建EntityManagers的令人困惑的事情是,有在JPA 3周的createEntityManagerFactory()方法和所有3個取persistenceunit名。我沒有意識到,在我檢查JPA 2.0規範之前,屬性會覆蓋persistenceunit名稱。 9.4.3節說明這些屬性覆蓋了persistence.xml中給出的值。它還顯示了標準屬性名稱。

(的Javadoc不告訴你什麼可以進入的財產,他們不說,性能超越什麼是persistence.xml中。在那裏的JavaDoc吸另一個例子。)

你的示例使用屬性名稱,如「JDBC_URL」,它們不在Java EE 6 API Javadoc中。 JPA規範解釋說,除了標準屬性之外,還可以使用供應商特定的屬性名稱。該文檔的EclipseLink表明,通過實施非標準PersistenceUnitProperties類支持哪些屬性名稱:

http://www.eclipse.org/eclipselink/api/2.3/index.html

所以爲了擁有動態EntityManagers有必要使用供應商特定的屬性,所以動態的實體管理人員不便攜。我想你不能擁有一切。

動態EntityManagers可移植的一種情況是通過使用標準的javax.persistence.jtaDataSource屬性。您將不得不將數據源添加到Java EE容器,但是這與在容器中運行時一樣動態。在Java SE中,它看起來沒有任何便攜式動態選項。

JavaDocs需要更好地解釋屬性如何處理createEntityManagerFactory()方法。

+0

是的,一些屬性留給實現,無法在規範中找到它。 'JDBC_URL'是通用的,僅供顯示用途,需要由供應商特定的屬性替換。此外,只有2種方法可用於創建工廠,第一種是使用xml和其他名稱和屬性描述的單元名稱。 – 2012-02-22 18:27:13

+0

第三種方法在javax.persistence.spi.PersistenceProvider中,它看起來像是供應商實現使用的,並且通常不用於應用程序開發。 – 2012-02-22 19:04:41

相關問題