使用Hibernate设置数据库无关的默认列时间戳

时间:2010-06-08 18:22:31

标签: java hibernate h2

我正在开发一个充满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 个答案:

答案 0 :(得分:2)

您可以尝试以下操作(没有generated,因为您的数据库没有生成值):

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

答案 1 :(得分:1)

您是否尝试在<class>内使用a <timestamp> mapping

文档不是很清楚,但听起来这会导致映射一个值为时间戳的列。

您可以通过设置generated="insert"generated="always"来指定Hibernate是否应使用database generated value