2010-10-05 58 views
7

這是我的無狀態的bean:如何定義兩個持久化單元(一個用於生產,一個用於單元測試)?

@Stateless 
public class Finder { 
    @PersistenceContext(unitName = "production") 
    EntityManager em; 
    [...] 
} 

它明確地定義了持久性單元的名稱是production。本機配置爲persistence.xml,一切正常。當我單元測試這個類時,我必須使用另一個持久性單元,具有不同的屬性和配置設置。我應該如何組織它?在persistence.xml中創建另一個<persistence-unit>元素?這是否存在最佳實踐?

回答

8

我使用相同的持久單元名稱,但使用不同的persistence.xml文件(如果您需要編輯代碼以啓用「測試模式」,您將如何自動執行測試?)。

如果你還在使用Maven,Maven的原生支持具有配置文件的測試版本:

  • 「生產」 persistence.xmlsrc/main/resources/META-INF
  • 「測試」 persistence.xml進入下src/test/resources/META-INF下,並用供測試用。
+1

謝謝,這就是我正在尋找的(persistence.xml'的測試副本)。當然,我正在使用Maven,還有什麼? :) – yegor256 2010-10-05 09:56:17

+0

@Vincenzo究竟,還有什麼? :) – 2010-10-05 10:13:52

+0

@PascalThivent帕斯卡我高度重視你所有的答案。你能告訴我爲什麼你使用一個單獨的persistence.xml和一個名字相同的PU?如果Maven可以選擇正確的PU使用,我會認識到它的便捷性。然而我的項目並沒有被maven化,所以我不得不跳過一些箍來使用兩個persistence.xml文件。由於兩個persistence.xml文件會導致配置重複,因此使用兩個不同的persistence.xml文件會帶來哪些其他好處? – 2013-11-19 18:17:48

2

我簡單地在persistence.xml中創建了另一個<persistence-unit>元素。

+0

你如何指示容器使用另一個持久性單元? – yegor256 2010-10-05 09:55:24

+0

@Vincenzo - 我用Spring來配置,我有一個applicationContext.xml和一個testApplicationContext :) – willcodejavaforfood 2010-10-05 11:18:20

0

您可以在配置中創建第二個持久單元,但這並不一定意味着你應該。當然,多個PU是完全正確和適當的,但當他們專門針對不同的環境時,我會避免將它們混合起來。生產與測試。

在您的實例中,我有兩個持久性配置文件,並且在適當的時候選擇Ant/Maven/build工具複製/重命名正確的文件。

0

我有一個類似的問題,我想提供另一種方法。我想運行測試產品,但我不使用兩個persistence.xml或代碼修改。我只有一個持久性單元,但有不同的運行時環境(standalone.xml,Wildfly)。 假設我想對我的開發數據庫運行,我使用測試運行時環境啓動Wildfly。當我想模擬它作爲真正的用戶時,我運行在產品環境中。唯一的區別是standalone.xml中的數據源條目。描述符總是相同的(例如myappDS,因此persistence.xml中的持久化單元聲明總是相同),但是在測試服務器中,數據源條目指向我的測試數據庫,以便將數據源條目指向我的prod數據庫。

相關問題