【问题标题】:JPA and SQLite3 - Wrong dateJPA 和 SQLite3 - 日期错误
【发布时间】:2012-02-16 22:09:02
【问题描述】:

我的实体类中的日期字段定义如下:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_EXECUTED")
private Date lastExecuted = new Date();

但是,当它通过 JPA 持久化到 SQLite3 数据库时,数据库值始终为 '1899-12-30'。你有什么想法吗?

在数据库中,字段定义为DATETIME

我尝试过同时使用 SqliteJDBC 和 Xerial SQLite JDBC。

更新:在EclipseLink JPA中开启SQL调试,关闭参数绑定后,貌似插入了如下日期:

insert into run (last_executed) values ('{ts ''2012-02-17 10:34:58.013''}');

如果在 SQLite 中手动插入,则会给出日期“1899-12-30”。

当然,任何解决方法都将不胜感激。

【问题讨论】:

  • 显然您在那里使用了特定的 JPA 实现,并且每个 JPA 实现都会给出不同的结果。因此,实际上提到哪个 JPA 实现会有所帮助;-)
  • 对不起;它是 EclipseLink JPA。
  • 无法帮助您,因为 DataNucleus JPA 将 INSERT 设置为“INSERT INTO A (LAST_EXECUTED) VALUES ('2012-02-17 13:41:09.453')”并且在检索时具有所有它拥有的数据持久化
  • '1899-12-30' 是零日期,那么数据库中的数据类型是什么?它可能只是存储时间信息并将日期转换为 0。

标签: sqlite jpa eclipselink


【解决方案1】:

插入中的日期看起来是正确的,所以似乎是某种 SQLite 问题。您通常应该使用参数绑定,似乎 SQLite 确实允许绑定 Timestamp,或者忽略 DATE 部分。如果使用 TemporalType.DATE 会怎样?

也许尝试通过原始 JDBC 来查看您的 JDBC 驱动程序问题到底是什么?

对于打印的语法,如果不使用参数绑定,您可以通过创建自己的 DatabasePlatform 子类来自定义它。您打印的语法是标准的 JDBC 时间戳语法。

【讨论】:

    【解决方案2】:

    您能否验证它是 java.util.Date 而不是 java.sql.Date?

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

    如果重新打开参数绑定,调试输出会是什么样子?

    【讨论】:

      【解决方案3】:

      使用smalldatetime解决问题~~~试试吧。

      【讨论】:

        猜你喜欢
        • 2011-07-15
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 2021-01-07
        • 1970-01-01
        相关资源
        最近更新 更多