【问题标题】:Field with @CreationTimestamp annotation is null while save on repository保存在存储库中时,带有 @CreationTimestamp 注释的字段为空
【发布时间】:2016-11-08 16:39:03
【问题描述】:

(1) 为什么“@CreationTimestamp”字段更新为空,以便在存储库上调用“保存”,该字段的值为空? 我希望用“@CreationTimestamp”注释的字段在创建时永远不会更新和维护一次。但在我当前的项目中,它并不适用。

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

【问题讨论】:

  • 你有 @CreationTimestamp 注释字段的公共 getter 吗?
  • 是的,我们有它,但它似乎没有帮助。现在我们不再使用@CreationTimeStamp 注释,而是坚持使用@Column(updatable=false)
  • 奇怪。在这里有效。

标签: hibernate jpa jersey


【解决方案1】:

现在是2020年,hibernate-core-5.3.12,还需要设置updatable为false。

@CreationTimestamp      
@Column(updatable = false)
private LocalDateTime createdDate;

更新

我相信这不会解决这个问题,因为这个 CreationTimestamp 来自本机 hibernate 包 (org.hibernate.annotations),我相信努力将集中在 jpa 抽象上 (org.springframework.data.annotation.CreatedBy)

【讨论】:

  • 这对我有帮助:)
  • 哇,我在哪里可以找到有关此问题的更多信息或有关修复的更多详细信息?谢谢!它奏效了
  • 我不知道是否正在进行一些修复。我相信没有,因为这个 CreationTimestamp 来自本机 hibernate 包 (org.hibernate.annotations),我相信他们正在将精力集中在他们的 jpa 抽象上 (org.springframework.data.annotation.CreatedBy)。见springbootdev.com/2018/03/13/…
  • 令人惊讶的是,几乎所有教程都未能捕捉到这一细节。
【解决方案2】:

@CreationTimestamp 不是 JPA,而只是 Hibernate。

要使用创建日期自动创建字段,您可以定义如下属性:

  @Column(name = "creation_date", updatable = false)
  @Temporal(javax.persistence.TemporalType.TIMESTAMP)
  private Date creationDate = new Date();

【讨论】:

    【解决方案3】:

    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 很有用...

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2020-03-24
      • 2018-03-09
      • 2012-06-01
      • 2011-05-04
      • 1970-01-01
      • 2020-12-05
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多