Мгновенный тип и тип даты - PullRequest
0 голосов
/ 02 мая 2018

У меня был объект с переменной created тип Date

public class UserEntity {
...
    @Basic(optional = false)
    @Column(name = "created", nullable = false, updatable = false)
    @CreatedDate
    private Date created;
...
}

таблица создала столбец с типом TIMESTAMP и правильно добавила объект в таблицу

[EL Fine]: sql: 2018-05-02 21:54:25.578--ClientSession(210949780)--Connection(1559972721)--INSERT INTO users (activation_token, avatar_id_in_cloud, avatar_provider, created, email, email_change_token, enabled, entity_version, modified_date, new_email, password, unique_id, username) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [null, null, null, [here created ==> 2018-05-02 21:54:25.279 <== here created, TkM2Gs9Hrd@gmail.com, null, true, 1, B@6f8060ac, null, $2a$12$/MwdBoXwBgHlxnsicVW.w.UWdYo6ulLH87aZtSxhdbBYA.9QacUXy, 74a45e29-c1f8-40dc-ac25-a7196d7870b4, JonkiPro]

однако, согласно Java 8, я изменил тип Date на Instant.

public class UserEntity {
{
    @Basic(optional = false)
    @Column(name = "created", nullable = false, updatable = false)
    @CreatedDate
    private Instant created;
...
}

Теперь он автоматически создает таблицу с LONGVARBINARY созданным столбцом, сгенерированная команда выглядит следующим образом

[EL Fine]: sql: 2018-05-02 21:54:25.578--ClientSession(210949780)--Connection(1559972721)--INSERT INTO users (activation_token, avatar_id_in_cloud, avatar_provider, created, email, email_change_token, enabled, entity_version, modified_date, new_email, password, unique_id, username) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [null, null, null, [here created ==> B@6f8060ac <== here created, TkM2Gs9Hrd@gmail.com, null, true, 1, B@6f8060ac, null, $2a$12$/MwdBoXwBgHlxnsicVW.w.UWdYo6ulLH87aZtSxhdbBYA.9QacUXy, 74a45e29-c1f8-40dc-ac25-a7196d7870b4, JonkiPro]

вместо даты есть строка B@6f8060ac, а в базе данных она уже записана как aced00057372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770d02000000005aea177110a133c078. Что происходит с датой? Я использую базу H2 и EclipseLink.

1 Ответ

0 голосов
/ 03 октября 2018

Кажется, что тип Instant не поддерживается JPA, даже последняя версия 2.2, которая поддерживает большинство новых типов времени.

Тип

Instant поддерживается Hibernate и DataNucleus, которые автоматически сопоставляют его с TIMESTAMP. Но это не относится к EclipseLink, который обрабатывает его как любой другой объект и использует сериализацию для сохранения его в базе данных.

В спецификации JPA 2.2 перечислены только следующие типы, обработанные особым образом:

Типы примитивов Java, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java .sql.Timestamp, byte [], Byte [], char [], Character [], java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime, java.time.OffsetDateTime

Все остальные, включая Instant и ZonedDateTime, поддерживаются как любой другой тип Serialiazable, если только реализация не делает больше, чем требует спецификация (Hibernate и DataNucleus делают, EclipseLink нет). Надеемся, что это будет исправлено в будущем в EclipseLink и в следующей версии спецификации JPA.

...