使用Hibernate以毫秒精度存储日期

3

我试图使用Hibernate以毫秒精度持久化Date对象。

private Date date = new Date();

@Column(columnDefinition="DATETIME(3)")
public Date getDate() {
    return date;
}

在数据库中,毫秒组件始终为.000。使用Hibernate存储带有毫秒精度的Date对象是否不可能?


java.util.Date 已经包含毫秒精度。这在数据库和ORM层面上都应该可以正常工作。你使用的是哪个版本的Mysql和Hibernate? - Nikhil Sahu
3个回答

1

java.util.date只能持久化到秒级,因为ORM将其映射为SQL DATE类型,该类型可能不包含毫秒(至少在我熟悉的实现中是这样)。

java.sql.timestamp支持分数秒。

如果可以的话,我肯定会考虑使用新的Java 8日期库(或者如果无法使用Java 8,则使用joda)。它们更好。


2
我已经尝试将字段更改为时间戳,但它没有任何效果。 - AlyoshaKaramazov
目前切换到Java 8日期库的建议非常糟糕,因为Hibernate对它们的支持非常差。 - AlyoshaKaramazov
是的,以下类型支持Java 8:@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") - StuPointerException

-1

尝试更新数据库连接器版本(.jar或依赖项,如果您使用构建自动化工具)。这对我有用。我在MySQL中使用了简单的java.util.Date和DATETIME(3)。


-1

这与 java.util.Datejava.sql.Timestamp 的文档行为一致。

java.util.Date 存储到秒,而 java.sql.Timestamp 是一个薄包装器,以容纳 SQL 时间戳值的纳秒值。如果您阅读 Timestamp javadoc 上的注释,它清楚地说明了这种差异。

如果您不想丢失秒分数,并且不想调查替代日期库(例如Joda Time),则需要将字段设置为 java.sql.Timestamp,并使用当前日期的毫秒值构造初始值。

java.util.Date date = new java.util.Date();
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime());

3
文档清楚地表明:“类Date表示时间的特定瞬间,精确到毫秒。” Date类的compareTo方法也将Date对象与毫秒精度进行比较。将字段(以及数据库列)更改为时间戳没有影响。 - AlyoshaKaramazov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接