日期:2014-05-16  浏览次数:20451 次

在Hibernate中使用日期函数获取数据库时间

在Hibernate中使用日期函数获取数据库时间

???? 为了避免在应用服务器与数据库服务器分别部署时候,由于应用服务器时间与数据库时钟不同步导致的问题(这在交易系统中尤为重要),在编程时候应当尽量采用数据库时间戳而不要使用应用服务器的时间戳,另外为了避免直接使用特定数据库时间函数而导致的与数据库类型绑定,在后期数据库切换时候带来的修改成本,尽量充分利用Hibernate来完成对数据库时间戳的获取,做到对数据库类型及函数的隔离。在Hibernate中有如下几种方案可以采用:

1、 利用Hibernate本身提供的current_date,current_timestamp,current_time函数

由于Hibernate在HSQL中必须有对象,因此使用这些函数时候必须依托某个vo对象。例如有一个VO对象BssProduct。

select current_timestamp() from BssProduct

2、 利用Hibernate的formula表达式来做影射

例如在BssProduct.hbm.xml中通过formula 的表达式来影射字段

??

 <property name=”mydate” type=”java.utl.date”  formula=”( select now() from bss_product bs ) ” /> 

?

注意:使用formula时候sql语句中的table名称及字段名称一定要是数据库中的表名称,而不能用表影射的java类。

然后在BssProduct.java VO中增加mydate的get,set方法

?

   private Date mydate; 

    public Date getMydate() { 
        return mydate; 
    } 

    public void setMydate(Date mydate) { 
        this.mydate = mydate; 
    } 

?

然后在HSQL中就可以把mydate作为普通的字段使用

select product.mydate from BssProduct product 

?

这样在切换数据库时候只需要修改配置文件即可,而不用修改代码。

当然与此类似,可以通过NamedSQLQuery的方式来配置sql,调用数据库函数,然后迁移数据库时候也只需要修改对应的sql,而不用修改代码。

3、通过数据库对视图的支持,然后Hibernate来做影射,通过视图来隔离数据库函数的不同。

但此种方式对于不支持视图的数据库无效(5.0以前的Mysql不支持视图)

CREATE VIEW my_timestamp AS SELECT CURRENT_TIMESTAMP AS my_timestamp 

?

一般情况采用current_timestamp等缺省函数,特殊情况采用formula方案,有空可以仔细研究一下formula的用法,实际上可以完成很多功能。