gpt4 book ai didi

java - 如何使用 java.sql.Timestamp 作为真正的 java.util.Date 与 JPA

转载 作者:太空狗 更新时间:2023-10-29 23:03:44 26 4
gpt4 key购买 nike

我对以毫秒为单位的日期管理有疑问。我理解需要使用 TIMESTAMP 来存储毫秒数:

@Temporal(TIMESTAMP)
@Column(name="DATE_COLUMN", nullable = false)
@Override public java.util.Date getDate() { return this.date; }

但是如果我无法将这个日期与另一个 java.util.Date 实例进行比较,除非我注意 equals() 调用的顺序,因为 this.date 实例是一个 java .sql.时间戳。如何从 JPA 获取 java.util.Date?因为来自JPA的日期,即使方法签名是一个java.util.Date,实际上也是一个java.sql.Timestamp的实例。

java.util.Date newDate = new Date(this.date.getTime());
this.date.equals(newDate) == false
newDate.equals(this.date) == true

我尝试在持久性类中修改我的方法:

@Override
public Date getDate() {
return this.date == null ? null : new Date(this.date.getTime());
}

它可以工作,但是对于大量数据来说效率不高。

还有其他选择:

  • 我可以修改我的持久性类的设计,使用 @PostLoad 以便在我检索它之后从持久化的日期创建一个 java.util.Date。

  • 我想知道我是否无法使用 ClassTransformer 获得结果?

你遇到过这样的问题吗?我有什么不正确的吗?处理此问题的最佳方法是什么?

最佳答案

TBH,我不确定它的确切状态,但 Hibernate(这是您的 JPA 提供程序,对吗?)处理 TIMESTAMP 列的方式确实可能存在问题。

为了将 SQL TIMESTAMP 映射到 java.util.Date,Hibernate 使用 TimestampType,它实际上会分配一个 java.sql.Timestamp。到您的 java.util.Date 属性。虽然这是“合法的”,但问题是 Timestamp.equals(Object)不对称的(到底为什么?!),这打破了 的语义>Date.equals(Object).

因此,如果 myDate 映射到 SQL TIMESTAMP,则您不能“​​盲目地”使用 myDate.equals(someRealJavaUtilDate) ,这当然不是真正可以接受的。

但是尽管这已经在 Hibernate 论坛上进行了广泛的讨论,例如在 this threadthis one (阅读所有页面),似乎 Hibernate 用户和开发人员从未就此问题达成一致(参见 HB-681 等问题),我只是不明白为什么。

也许这只是我,也许我只是错过了一些对其他人来说很简单的东西,但这个问题对我来说很明显,虽然我认为这是愚蠢的 java.sql.Timestamp作为罪魁祸首,我仍然认为 Hibernate 应该保护用户免受这个问题的影响。我不明白为什么加文不同意这一点。

我的建议是创建一个演示该问题的测试用例(应该非常简单)并(再次)报告该问题以查看您是否从当前团队获得更多积极反馈。

与此同时,您可以使用自定义类型自己“修复”问题,方法如下(取自论坛并按原样粘贴):

public class TimeMillisType extends org.hibernate.type.TimestampType {

public Date get(ResultSet rs, String name) throws SQLException {
Timestamp timestamp = rs.getTimestamp(name);
if (timestamp == null) return null;
return
new Date(timestamp.getTime()+timestamp.getNanos()/1000000);
}

}

关于java - 如何使用 java.sql.Timestamp 作为真正的 java.util.Date 与 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com