让Hibernate创建TIMESTAMP列

时间:2018-03-22 16:38:46

标签: java hibernate jpa kotlin

我正在使用Hibernate 5.2.14通过Spring Boot 2.0和MySQL 5.7.20。 我让Hibernate生成我的Schema(ddl-auto=update,我知道只在开发阶段使用它)并且我无法让Hibernate在Schema中生成TIMESTAMP列。我尝试过的事情(在Kotlin):

@Column
var modifiedAt: Instant?

@Column
@Type(type = "timestamp")
var modifiedAt: Instant?

@Column
@Type(type = "Instant")
var modifiedAt: Instant?

@Column
@Temporal(TIMESTAMP)
var modifiedAt: Date?

@Column
@Type(type = "timestamp")
var modifiedAt: Date?

所有这些都会在数据库中生成DATETIME列。如何指示Hibernate创建TIMESTAMP列?我知道我可以使用columnDefinition = "TIMESTAMP",但这只是将原始SQL压缩到Hibernate的喉咙,这似乎是错误的。它真的是唯一的方式吗?

2 个答案:

答案 0 :(得分:0)

这就是我处理创建和更新时间戳的方法。

@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
var created: Date = Date()

@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
var modified: Date = Date()

@PreUpdate
protected fun onUpdate() {
    this.modified = Date()
}

答案 1 :(得分:0)

事实证明,Hibernate的人比我聪明,并且实际上阅读了MySQL文档 - 事实证明,MySQL中的TIMESTAMP很糟糕,主要是32位,因此容易受到2038年的影响。 DATETIME因此是较小的邪恶,你只需要确保以UTC格式存储所有内容。

链接到Hibernate论坛:https://discourse.hibernate.org/t/why-does-hibernate-orm-uses-datetime-by-default-on-mysql-instead-of-timestamp/422