(1)为什么" @ CreationTimestamp"字段已更新为null,以便"保存"调用存储库时该字段的值为空? 我希望用" @ CreationTimestamp"注释一个字段。永远不会在创建时更新和维护一次。但是在我目前的项目中它并没有这样做。
(2)我必须包含@Column(updatable = false)(除了@CreationTimestamp注释)。为什么这有必要?
答案 0 :(得分:10)
现在是2020年,hibernate-core-5.3.12,仍然需要将可更新设置为false。
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdDate;
答案 1 :(得分:2)
1)我在使用Hibernate 5.3.7的Spring Boot 2.1.2上遇到了相同的问题。
我读过here,说java.util.LocalDateTime
处理是Hibernate 5.2.3中引入的,在该版本之前,您必须使用以下日期类型之一:
但是它仍然对我不起作用...
所以我想到了javax.persistence.PrePersist
注释:
...
@Column(name = "created_at", updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
...
@PrePersist
public void prePersistCreatedAt() {
this.createdAt = new java.util.Date();
}
2) 这篇文章讨论了该主题并给出了恰当的解释:Please explain about insertable=false and updatable=false in reference to the JPA @Column annotation。
还要注意不被接受的帖子,尤其是:
当您需要在实体中多次映射字段时,定义insertable = false,updatable = false很有用...
答案 2 :(得分:1)
@CreationTimestamp不是JPA,而只是Hibernate。
要使用创建日期自动创建一个字段,可以定义如下属性:
@Column(name = "creation_date", updatable = false)
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date creationDate = new Date();