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中定义的时间戳的类型。
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进制数。