2011-02-14 61 views
0

我創建一個基於JPA的應用程序,我需要在EntityManger很多不同影響的地方。所以我創建一個單獨的類,返回的實體管理器:最佳實踐獲得EntityManger對於任何測試或生產

class MyDB { 
    static EntityManger getEM() { 
     ... 
    } 
} 

我想用這對於測試和生產環境。爲了測試,我想添加一個方法setTestEnvironment()來確保使用TEST數據庫。 (這必須在第一次getEM()調用之前調用)。

什麼是選擇生產數據庫或測試數據庫的最佳方式。我可以在persistence.xml中添加多個持久性單元嗎?什麼是其他的選擇?

回答

0

最後,如在我的最初的問題指出,我創建了可以首先被調用來設定正確的數據庫的單獨(單)類:

public static void setEnvironment(ApplicationEnvironment env) { 
    environment = env; 
} 

public enum ApplicationEnvironment { 
    UNKNOWN, PRODUCTION, TEST, DEVELOPMENT 
} 
基於該設定環境

,右持久性-unit被選中:

Persistence.createEntityManagerFactory(getEMFactoryParameter()); 
    ... 

    public String getEMFactoryParameter() { 

     if(environment == ApplicationEnvironment.DEVELOPMENT) { 
     return "mydb_dev"; 
     } else if(environment == ApplicationEnvironment.TEST) { 
     return "mydb_test"; 
     } else { 
     return "mydb_prod"; 
     } 
    } 
1

我們使用Spring,它使事情變得非常容易與註解@PersistenceContext可任選採取同樣在persistence.xml持久性單元,並且還提供了良好的測試框架JUnit的一樣。

@PersistenceContext 
public EntityManager entityManager; 

單身人士的名言很難測試(你將不得不添加一些東西像setForTest()和resetForTest()),也被稱爲singletonitus。投入時間使用IoC容器(spring或谷歌guice)可以使重構,測試和擴展代碼更容易。

1

如果是在應用服務器中運行 - 甚至是一個servlet容器,如Tomcat - 你可以簡單地具有連接的詳細信息通過容器處理。

在Tomcat中,你的web應用程序上下文XML文件中指定這一點,並在你的持久XML使用資源的完整JNDI名稱。

+0

我還沒有(還)與tomcat合作,我仍然沒有在Web應用程序之外。我的意圖是當它準備好生產時去一個tomcat應用程序。 – Roalt 2011-02-14 09:45:53