Обрабатывать DateTime в JPA2 - PullRequest
       32

Обрабатывать DateTime в JPA2

15 голосов
/ 23 февраля 2012

Я использую JPA2 с реализацией EclipseLink. Я просто пытаюсь сохранить текущую дату в столбце DateTime в базе данных MySQL.

Объект даты, который должен быть сохранен, просто создается:

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

Теперь currentDate содержит точную дату и время. Этот объект сохраняется в таблице со следующим столбцом:

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

TemporalType имеет три константы:

  • DATE - сохраняет в БД дату без времени: (2012-02-23 00:00:00)
  • TIME - выдает ошибку несовместимости
  • TIMESTAMP - сохраняет в БД дату без времени: (2012-02-23 00:00:00)

Столбец базы данных создается следующим образом:

date_opening DATETIME NULL DEFAULT NULL,

Для всех этих опций мне не удается сохранить время и дату.

Ответы [ 2 ]

15 голосов
/ 23 февраля 2012

Это должно прекрасно работать с TemporalType.TIMESTAMP и типом столбца базы данных DATETIME. Возможно, вы проверяете тип для неправильного столбца: в отображениях у вас есть «DATE_CREATED» и в определении столбца «date_opening».

Вы также спросили, почему нет TemporalType.DATETIME. Причина заключается в том, что значения TemporalType имеют однозначное сопоставление с временными типами JDBC в java.sql. [DATE / TIME / TIMESTAMP], в конце JPA должны играть вместе с JDBC.

Я тестировал со следующим кодом (env: EclipseLink 2.3.0, Connector / J 5.1.6, MySQL 5.1):

Entity / отображение:

@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 и библиотеки.

1 голос
/ 01 марта 2018

С отображением:

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

когда вы получаете данные из MySQL - это дает что-то вроде:

1519621200000

...