我正在尝试使用 Hibernate 在 MySQL 的时间戳列中存储带有毫秒的 java
Date
,但毫秒代码始终存储为 .000。
hibernate中列的定义如下:
@Type(type="timestamp")``
private Timestamp timestamp;
在数据库中,该列被声明为
TIMESTAMP(3)
我尝试了不同的组合,包括
Date
,但都没有帮助。
我使用 MySQL 5.6.25、Connector/J 版本 5.1.37、Hibernate 4.0.1。
我已经研究了一段时间,但仍然找不到任何适合我的解决方案。
如有任何帮助,我们将不胜感激。
您尝试过使用
DATETIME(3)
或 TIMESTAMP(4)
吗?我相信这两个都会给你毫秒。如果您试图获取交互发生的毫秒时间(例如行更新),您可以使用 ON UPDATE DATETIME(3)
Hibernate 和 MySql 交互似乎消除了 Date/Timestamp Java 属性的毫秒精度。我也有同样的问题。
我的解决方案是“破解”hibernate,告诉实体属性是一个字符串,然后序列化/反序列化 setter/getter 中的值
@Column(name="time")
private String time
...
public Date getTime(){
return strTodate( this.time );
}
public void setTime(Date value){
this.time = dateToStr( value );
}
当 MySQL 收到 Datetime(3) 列的字符串时,字符串会被正确转换并且毫秒不会丢失:-)
幸运的是,当从 MySQL 读取时,Datetime(3) 被正确序列化为字符串,而不会丢失毫秒
使用的字符串日期格式为“yyyy-MM-dd hh:mm:ss.SSS”
这个解决方案的想法是,不要让 hibernate 处理日期。将责任委托给 MySql。
不幸的是,MySQL 不接受标准 ISO 字符串(即:“yyyy-MM-ddThh:mm:ss.SSSZ”),并且此解决方案与 postgres 不兼容(字符串日期格式不一样)
我刚刚遇到了这个问题,解决办法就是将 JDBC 驱动程序从
com.mysql:mysql-connector-j:8.0.31
更改为 org.mariadb.jdbc:mariadb-java-client:3.3.1
。
如果您这样做,请不要忘记将 JDBC URL 从
jdbc:mysql:...
更改为 jdbc:mariadb:...
。