我有一个变量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。
答案 0 :(得分:1)
JPA似乎不支持Instant
类型,甚至不支持支持大多数新时间类型的最新版本2.2。
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
所有其他类型,包括Instant
和ZonedDateTime
都可以作为任何Serialiazable类型来支持,除非实现的作用超出规范要求(Hibernate和DataNucleus不需要,EclipseLink不需要)。希望将来可以在EclipseLink和JPA规范的下一版本中解决此问题。