即时类型和日期类型

时间:2018-05-02 20:12:38

标签: java spring eclipselink

我有一个变量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 base和EclipseLink。

1 个答案:

答案 0 :(得分:1)

JPA似乎不支持Instant类型,甚至不支持支持大多数新时间类型的最新版本2.2。

Hibernate和DataNucleus支持

Instant类型,它们会自动将其映射到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规范的下一版本中解决此问题。