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

Я использую 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,

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

Ответ 1

Это должно отлично работать с 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 и библиотеки.