2013-02-14 66 views
1

我(在不觸及JPA的一段時間後)啓動了一個使用Hibernate 4.1,JPA2和Spring的項目。這是一個具有共同生命週期的maven項目。在maven測試中生成數據庫模式(Hibernate)

運行mvn測試時,我得到預期的結果找不到所需的數據庫對象(連接如預期的那樣成功)。然而,我的所有研究和實驗都不足以製造出似乎是常見的情況。

  • 我希望在執行單元測試時能夠將maven刪除/創建模式作爲本地開發數據庫;我想到hibernate3-maven-plugin(理想版本3.0)應該可以處理這個,但是我沒有設法讓它工作。我不希望任何數據的自動插入(爲此我可以使用DBUnit,或者甚至更好地讓每個測試都生成它自己的測試數據,但這在這裏沒有任何作用),但我確實希望在測試數據庫上刷新模式,反映了我註釋的模型類的當前狀態。我想這會被綁定到流程測試資源階段。我想用(當前)模式定義生成一個(或一組)sql文件,但是我得到的最好結果反映了這裏描述的問題:Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException"(到目前爲止還沒有解決方案)。

我是否錯過了一些愚蠢的東西或者它現在真的不可能? 我會很高興,如果有人能提供給我任何

  • 的適當的文件,這是應該如何來實現

  • 使用Hibernate 4個

  • 實用的任何準則的工作示例用其他策略實現我的目標的方法。

如果它有任何相關性,數據庫是Postgres 9.1。

在此先感謝。

回答

0

再回答我自己的問題。

爲了達到我想要的結果,我必須在process-test-resources階段鏈接maven執行hibernate3-maven-plugin的hbm2ddl進程類階段和另一個sql-maven-plugin執行階段。第一個爲Hibernate的模型生成sql,第二個將它應用到數據庫。

事後看來,實際上似乎體面和乾淨的解決方案。

我仍然有興趣知道的最佳實踐,如果他們從我的解決方案不同,以實現與Maven測試從休眠模式建立數據庫的目的。

2

這樣做的一種方法是使用Arquillian。您可以爲每個測試或一組測試創建一個單獨的部署包,並使用它自己的persistence.xml和數據源。使用hbm2dll設置在persistence.xml要麼創建拖放或更新模式:

<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 

如果你想預填充數據庫,您可將import.sql添加到您的部署,這將通過休眠應用啓動時執行,或使用Arquillian Persistence extension

下面是一個完整的Arquillian測試設置爲例如:

@RunWith(Arquillian.class) 
public class MyTest { 

    @Deployment 
    public static Archive<?> createTestArchive() { 

     return ShrinkWrap.create(WebArchive.class, "myTest.war") 
       .addPackages(true, "com.example") 
       .addAsResource("testSeeds/seed.sql", "import.sql") 
       .addAsResource("in-mem-persistence.xml", "META-INF/persistence.xml") 
       .addAsWebInfResource("in-mem-datasource.xml"); 
    } 

一個缺點是,在所述容器的測試會比簡單的單元測試慢。

我不確定Arquillian能夠很好的和Spring一起玩,我只用它來做Java EE應用程序,所以請告訴我們它是否有幫助。