2009-11-10 103 views
1

基本上這個想法是爲兩個不同的底層數據庫使用相同的hibernate映射文件。在生產中,底層數據庫是MySQL5,爲了測試的目的,我想使用Apache Derby--以避免爲測試目的設置和維護各種MySQL數據庫。使用兩個不同的數據庫和相同的休眠映射文件

我希望只是交換數據源的驅動程序,並改變一些PARAMS會做的工作,但我已經遇到了一些小的困難。所以實際上有兩個問題。第一個具體問題是:

一,是否有可能告訴Derby其數據類型,如果數據類型是可以在MySQL和是不是在德比中使用。映射如下:

<property name="about"> 
    <column name="`about`" not-null="false" sql-type="text"></column> 
    </property> 

德比不知道sql型「文本」,所以它拒絕創建表。它是Derby 10.4.2.0和Hibernate 3.2.6。順便一提。

二,使用兩個不同的數據庫進行測試和生產的經驗是什麼?我知道有一些缺點,例如你不能測試存儲過程或數據庫特定的查詢 - 但另一方面,它使測試更容易,更快速(如果你最終得到它的運行)。你怎麼看?

回答

3

問題1 - 不指定sql類型;使用Hibernate type代替:

<property name="about" type="string" length="4096"/> 

然後可以延伸Hibernate提供映射該類型到適當的基礎上(未)指定長度DB類型德比(或MySQL)方言。以MySQLDialect爲例,它會根據長度將字符串類型映射到varchartext類型之一。

問題2 - 你的意思是使用不同的數據庫開發和生產?由於使用不同的數據庫進行測試生產就像玩俄羅斯輪盤賭滿載桶 - 你是不是要去贏:-)

你總是需要測試所有適用的部署配置。如果您確實需要同時支持這兩種DB,那麼使用不同的DB進行開發和生產並不是一個壞方法,因爲它有助於儘早定位可移植性問題。

+0

它實際上是測試而不是開發。有所有有用的答案,但你與俄羅斯輪盤賭的觀點只是說服了我,謝謝:-) – msparer 2009-11-11 18:37:41

1

的主要原因使用測試不同類型的數據庫中,在我看來,能有更快的單元測試的地方是不切實際的假的或模擬數據庫(雖然時,你可以,你應該做的是後者)。請注意,應該有一個臨時會話,其中可以針對生產類型的數據庫運行測試,以確定您沒有編碼到測試數據庫。它也迫使你編寫一個通用數據庫 - 有時候這是一個好主意,有時候不是。

顯然,如果您需要數據庫特定功能(存儲過程或甚至特殊類型),則應使用相同的類型。

在MySQL的情況下,可以在測試設置表爲stored in memory。如果您可能需要MySQL特定的項目是一個選項。如果目標是數據庫通用性而不是在開發中使用不同的數據庫/低級別測試可能是一件好事。

1

應該有在不同環境中使用不同的數據庫供應商(注意ChssPly76的回答是TEST和PROD應該是相同的),沒有問題。雖然我還沒有嘗試德比(還)。

我個人喜歡使用HSQLDB作爲DEV環境。它體積小,靈活,便於攜帶,需要很少或不需要安裝。使用像Unitils這樣的工具粘合在一起Hibernate,DbUnit和JUnit對我來說工作得非常好。在執行JUnit測試之前,HSQLDB將加載靜態測試數據。這允許數據訪問層JUnit測試基於真實數據(它從坐在測試附近的一些xml文件加載)具有斷言。 (Unitils的一個注意事項是默認的「loadStrategy」是在加載之前刪除所有現有的數據,所以要小心你指向那個東西的地方)。

0

根據我的經驗,您測試的數據庫實現越多,您越早發現任何意外地依賴於不可移植的數據庫的地方。

如果Derby讓您的測試變得更快更簡單,那麼這是一個很好的結果,因爲更快,更簡單的測試會鼓勵更多的測試。

我認爲Derby是用於測試的絕佳選擇,因爲Derby非常努力地遵守SQL標準並僅支持標準中指定的語法和行爲,所以這應該有助於確保您避免使用非標準的數據庫功能。

但我同意當您接近部署您的應用程序時,您需要使用盡可能接近您的預期部署配置的配置進行測試。