使用 Hibernate 在 MySQL 时间戳列中存储毫秒

问题描述 投票:0回答:3

我正在尝试使用 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。

我已经研究了一段时间,但仍然找不到任何适合我的解决方案。

如有任何帮助,我们将不胜感激。

mysql hibernate time persistence
3个回答
0
投票

您尝试过使用

DATETIME(3)
TIMESTAMP(4)
吗?我相信这两个都会给你毫秒。如果您试图获取交互发生的毫秒时间(例如行更新),您可以使用
ON UPDATE DATETIME(3)


0
投票

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 不兼容(字符串日期格式不一样)


0
投票

我刚刚遇到了这个问题,解决办法就是将 JDBC 驱动程序从

com.mysql:mysql-connector-j:8.0.31
更改为
org.mariadb.jdbc:mariadb-java-client:3.3.1

如果您这样做,请不要忘记将 JDBC URL 从

jdbc:mysql:...
更改为
jdbc:mariadb:...

© www.soinside.com 2019 - 2024. All rights reserved.