2010-06-08 49 views
1

我正在研究一個充滿Hibernate(3.3.1)映射文件的Java項目,這些文件對於大多數域對象具有以下類型的聲明。使用休眠設置數據庫不可知的默認列時間戳

<property name="dateCreated" generated="insert"> 
    <column name="date_created" default="getdate()" /> 
</property> 

這裏的問題是,GETDATE()是MSSQL特定的功能,當我使用像H2測試項目的小節,H2的尖叫聲是

getdate() 

不一個公認的功能。它自己的時間戳功能

current_timestamp(). 

我希望能夠保持與H2的工作進行測試,並想知道是否有告訴Hibernate的「使用該數據庫自身的機制來獲取當前時間戳的方式」。隨着H2,我想出了以下解決方案。

CREATE ALIAS getdate AS $$ java.util.Date now() { return new java.util.Date(); } $$; 
CALL getdate(); 

它的工作原理,但顯然H2具體。

我試過擴展H2Dialect並註冊了函數getdate(),但是這似乎並沒有在Hibernate創建表時調用。是否有可能將默認時間戳的概念從特定數據庫引擎中抽象出來?

回答

2

你能試試以下(不含generated,因爲你的數據庫是不產生價值):

<column name="DATE_CREATED" sql-type="timestamp" default="CURRENT_TIMESTAMP"/> 
+0

我可以。我的觀點並不是我想完全轉向H2,而是我正在測試一小部分代碼,我不需要使用MSSQL,而在使用像H2這樣的內存數據庫的情況下,測試更快,更愉快。在每個數據庫管理系統中爲時間戳功能命名不同,感覺很愚蠢。 – Fil 2010-06-08 20:43:15

+0

HSQLDB與H2非常相似(從未使用H2,因此我不清楚功能的細節)並支持'CURRENT_TIMESTAMP'。我一直使用HSQL進行內存單元測試。 http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#N10544 – 2010-06-08 20:54:06

+0

@unsquared:我不是100%確定,但我認爲上述建議是可移植的。 – 2010-06-08 21:00:07

1

您是否在<class>內嘗試過使用a <timestamp> mapping

該文檔不是很清楚,但它聽起來像這應該導致映射一個列的值是一個時間戳。

您可以通過設置generated="insert"generated="always"來指定Hibernate是否應使用database generated value

+0

生成的屬性實際上並沒有做任何的產生(我已經試過了)的。來自你引用的文檔: 「當Hibernate爲已經定義了生成屬性的實體發出SQL INSERT或UPDATE時,它立即發出一個select來檢索生成的值。」 這假定數據庫已經配置完成生成。 我們已經在使用時間戳映射,但每當對象被Hibernate訪問時它都會更新,而不是在創建時就很簡單。 – Fil 2010-06-08 19:03:13

+0

啊,我想通過「生成」的文件意味着「由數據庫特定功能生成」,方言會知道。 – 2010-06-08 19:26:36

+0

是的。我假設是相同的,並且在我實際嘗試過所有這些getdate()函數的過程中,並將所有列設置爲NULL。這對於Hibernate文檔中的免責聲明來說非常方便。 – Fil 2010-06-08 19:30:49