hibernate自动建表设定字段类型为数据库中为timestamp类型

时间:2022-01-11 08:19:24

1:项目需要,字段应该设计为timestamp类型,但自动建表后总是被设置为datetime(当时用的数据库为sqlserver)

Google后,在配置文件(Xxx.hbm.xml)中column添加

sql-type="timestamp" default="CURRENT_TIMESTAMP"

后自动创建表后字段被设定为timestamp,默认为当前时间。

完整字段配置:

<property name="recordTime" type="java.sql.Timestamp">
<column name="recordTime" not-null="true" sql-type="timestamp" default="CURRENT_TIMESTAMP"/>

</property>

2:如果是用注解配置呢?应该怎么配置呢?如下即可:

@Column(name = "currenttime",columnDefinition="timestamp",insertable=false,updateable=false)
private String currenttime;

3:上面注解的关键在:columnDefinition="timestamp",timestamp就是sqlserver中定义的时间戳的类型。

hibernate自动建表设定字段类型为数据库中为timestamp类型

4:sqlserver字段类型,字段名,表名,数据库名是不区分大小写的,所以

columnDefinition="timestamp"

columnDefinition="TimeStamp"

columnDefinition="TIMESTAMP"

都是等价的,本人亲自测试过,读者不信也可以去试试。

5:insertable=false,updatable=false也是有用的,因为sqlserver中的timestamp是sqlserver自动产生的,所以即使是null值也是不允许插入的,不然插入数据的报时间戳显示插入错误。更新的时候亦是如此。

6:这里我们java中的数据类型是String类型,sqlserver中是timestamp,更新的时候,我发现会出问题,hibernate中报的是,String不能转化为integer,可见sqlserver中的timestamp本质就是一个16进制的整形数据。

7:用hibernate更新数据,如果样将查询出来的timestamp作为where条件,如

update table set fieldname=fieldvalue where id=? and currenttime=?

上面的currenttime一定是转化为十进制整形后的值,不然就会报string转化integer错误。

8:另外,本人还测试了一下mysql的timestamp,发现并不可用,mysql中的timestamp并不是整形的16进制数。