在JPA2中处理DateTime

Ion*_*nut 15 java datetime jpa-2.0

我正在使用JPA2和EclipseLink实现.我只是想将当前Date保存到DateTime列到MySQL数据库中.

应该持久化的日期对象只是创建:

import java.util.Date
Date currentDate = new Date();
Run Code Online (Sandbox Code Playgroud)

现在currentDate包含确切的日期和时间.此对象持久存在于具有以下列的表中:

@Column(name="DATE_CREATED")
@Temporal(TemporalType.DATE)
Date dateCreated;
Run Code Online (Sandbox Code Playgroud)

TemporalType有三个常量:

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

数据库列以这种方式创建:

date_opening DATETIME NULL DEFAULT NULL,

对于所有这些选项,我无法保存时间和日期.

Mik*_*unu 16

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

你还问了为什么没有TemporalType.DATETIME.原因是TemporalType的值与java.sql中的JDBC时态类型有一对一的映射.[DATE/TIME/TIMESTAMP],最后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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

表定义:

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

测试:

java.util.Date now = new Date();
SomeEntity se = new SomeEntity(1, now);
em.persist(se);
Run Code Online (Sandbox Code Playgroud)

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