【问题标题】:JPA + PostgreSQL: Only time being persistedJPA + PostgreSQL:只有时间被持久化
【发布时间】:2015-12-11 17:46:57
【问题描述】:

我有一个包含 timestamp without time zone 字段的 PostgreSQL 表。这在我的 Java 代码中配置如下:

@Column(name = "timestamp")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date timestamp;

时间戳属性设置为new Date(),即包含日期和时间。但是在数据库中,日期部分没有被持久化,例如“14:40:28.889”;因此,当从数据库中检索到日期时,不会加载日期并将其设置为默认值,即 01/01/1970。时间戳的日期部分正在运行的任何想法?

更新: 我增加了休眠的日志记录级别,因此我可以通过在 application.properties 文件中添加以下内容来查看正在保存的内容:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

日志输出如下:

binding parameter [6] as [TIMESTAMP] - [Wed Sep 16 08:57:03 CEST 2015]

更新 2:

我单步执行了代码,发现插入 sql 的日期格式为2015-09-16 11:16:09.416000 +02:00:00。我在 PGAdmin 中自动插入字符串,它插入没有错误。保存后点击小刷新按钮,日期部分消失了!所以数据被正确保存,但不知何故 postgre 之后做了一些奇怪的事情。

【问题讨论】:

  • 看一下用来持久化的SQL?
  • 由于它使用 JPA,我只调用了 save() 方法,日志只显示 insert into batch_steps (item_id, result, step, step_id, success, timestamp) values (?, ?, ?, ?, ?, ?)
  • 大多数(所有)JPA 提供者都可以选择查看传入的参数。您不会说您使用哪一个。 JPA 没有“保存”方法
  • 我使用org.springframework.data.jpa.repository.JpaRepository提供的保存方式
  • 所以您使用的是“Spring Data JPA”而不是 JPA API。尽管如此,所有 JPA 提供程序(DataNucleus、EclipseLink、Hibernate 等)都提供了一种查看这些参数的值的方法,因此请查阅您正在使用的任何文档。

标签: java postgresql jpa spring-data-jpa


【解决方案1】:

这是有史以来最愚蠢的错误之一,我有一个创建表的脚本,它被标记为“没有时区的时间”,即不是时间戳,所以 PostgreSQL 显然正在删除日期。我会留下这个问题,因为它可能有助于调试类似问题。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2021-12-16
    • 2012-07-02
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多