@CreationTimestamp注释的字段在保存在存储库时为null

时间:2016-07-06 14:57:03

标签: hibernate jpa jersey

(1)为什么" @ CreationTimestamp"字段已更新为null,以便"保存"调用存储库时该字段的值为空? 我希望用" @ CreationTimestamp"注释一个字段。永远不会在创建时更新和维护一次。但是在我目前的项目中它并没有这样做。

(2)我必须包含@Column(updatable = false)(除了@CreationTimestamp注释)。为什么这有必要?

3 个答案:

答案 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中引入的,在该版本之前,您必须使用以下日期类型之一:

  • java.util.Date
  • java.util.Calendar
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

但是它仍然对我不起作用...

所以我想到了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();