【问题标题】:Instant type and Date type即时类型和日期类型
【发布时间】:2018-05-02 20:12:38
【问题描述】:

我有一个带有变量 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。

【问题讨论】:

标签: java spring eclipselink


【解决方案1】:

JPA 似乎不支持Instant 类型,甚至不支持大多数新时间类型的最新版本 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

所有其他类型,包括 InstantZonedDateTime 都被支持为任何其他 Serialiazable 类型,除非实现比规范要求的更多(Hibernate 和 DataNucleus 会,EclipseLink 不会)。这有望在 EclipseLink 和 JPA 规范的下一个版本中得到解决。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2014-05-17
相关资源
最近更新 更多