在 JPA2 中处理日期时间

2022-09-03 06:32:29

我正在使用JPA2和EclipseLink实现。我只是尝试将当前日期保存到DateTime列中,然后保存到MySQL数据库中。

应该保留的日期对象只需创建:

import java.util.Date
Date currentDate = new Date();

现在,包含确切的日期和时间。此对象保留在具有以下列的表中:currentDate

@Column(name="DATE_CREATED")
@Temporal(TemporalType.DATE)
Date dateCreated;

有三个常量:TemporalType

  • DATE- 这节省了在DB的日期没有任何时间: (2012-02-23 00:00:00)
  • TIME- 这会引发不兼容错误
  • TIMESTAMP- 这节省了在DB的日期没有任何时间: (2012-02-23 00:00:00)

数据库列是这样创建的:

date_opening DATETIME NULL DEFAULT NULL,

对于所有这些选项,我都未能保存时间和日期。


答案 1

这应该与 TemporalType.TIMESTAMP 和数据库列类型 DATETIME 完美配合。也许您正在检查类型是否有错误的列:在映射中,您有“DATE_CREATED”,在列定义中“date_opening”。

你还问为什么没有TemporalType.DATETIME。原因是 TemporalType 的值在 java.sql 中具有到 JDBC 时态类型的一对一映射。[日期/时间/时间戳],最终JPA必须与JDBC一起玩。

我用下面的代码测试了(env:EclipseLink 2.3.0,Connector/J 5.1.6,MySQL 5.1):

实体/映射:

@Entity
public class SomeEntity {
    @Id
    private int id;

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

    public SomeEntity(int id, Date dateCreated) {
        this.id = id;
        this.dateCreated = dateCreated;
    }
    public SomeEntity() {
    }
}

表定义:

CREATE TABLE  `test`.`SOMEENTITY` (
  `ID` int(11) NOT NULL,
  `DATE_CREATED` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=innoDB DEFAULT CHARSET=utf8

测试:

java.util.Date now = new Date();
SomeEntity se = new SomeEntity(1, now);
em.persist(se);

它按预期工作,时间部分DATE_CREATED具有正确的值。如果列之间的不匹配不是问题,也许您也可以对此进行测试,并报告结果以及MySQL和库版本。


答案 2

使用映射:

@Temporal(TemporalType.TIMESTAMP)
    private java.util.Date dateCreated;

当您从MySQL检索数据时 - 它给出了如下内容:

1519621200000