【问题标题】:ON UPDATE CURRENT_TIMESTAMP and JPAON UPDATE CURRENT_TIMESTAMP 和 JPA
【发布时间】:2011-09-29 16:01:47
【问题描述】:

我有一个带有字段的实体

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;

@Version
@Column(name = "edit_count")
private short editCount;

private String text;

当我尝试使用 Spring-Data-JPA 进行更新时,我发现 edit_count 已增加,但 edit_timestamp 仍保持不变。如果我手动调用 SQL

UPDATE post SET TEXT='456' WHERE post_id=1;

edit_timestamp 已更新。如果我添加

@PreUpdate
protected void onUpdate() {
    editTimestamp = new Date();
}

它没有问题。我的问题是为什么没有@PreUpdate 没有更新edit_timestamp?

【问题讨论】:

  • 投反对票,请提供您的评论...

标签: sql hibernate jpa spring-data


【解决方案1】:

因为在您最初的一组注释中,您所告诉它的关于 edit_timestamp 列的只是它是一个时间戳; JPA 不知道它需要更新它。我猜当您手动执行 SQL 语句时,您有某种更新触发器正在为您更改这些字段 - 但是在您更新它时被来自持久实体的数据覆盖。
如果您不需要“已编辑”计数/时间戳,请尝试从实体中删除它们,看看是否有效。否则,您有一个可行的解决方案。

【讨论】:

    【解决方案2】:

    您需要更改列注释以包含可更新 = false。这将导致 edit_timestamp 列不显示在更新 SQL 中,因此 JPA 提供程序不会包含导致它覆盖默认值的字段的当前值。

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "edit_timestamp", 
            updatable = false,
            columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private Date editTimestamp;
    

    【讨论】:

    • 这是部分工作。如果 updatable = false,edit_timestamp 列不会显示在更新查询中。从数据库中,我观察到 edit_timestamp 已更新。但是,editTimestamp 的 getter 不知道更新的值,因为它不是由 @PreUpdate 触发的,所以它仍然返回旧值。
    • 嗨,我想知道我是否可以在创建时设置当前时间戳,但在更新时我希望它保持不变。
    • @LeeCheeKiam 如何解决这个问题,只需删除 updatable = false 似乎无法正常工作
    【解决方案3】:

    您可以在实体中将变量标记为更新或创建时间戳。在下面的示例中,您可以看到如何使用 hibernate 注释非常轻松地完成此操作:

    @UpdateTimestamp
    private LocalDateTime editTimestamp;
    
    @CreationTimestamp
    private LocalDateTime creationTimestamp;
    

    仅供参考并确保没有混淆,我对各自的数据类型和注释使用以下包导入:

    import org.hibernate.annotations.CreationTimestamp
    import org.hibernate.annotations.UpdateTimestamp
    import java.time.LocalDateTime
    

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 2017-04-26
      • 2011-07-31
      • 1970-01-01
      • 2012-01-01
      • 2014-03-16
      • 1970-01-01
      • 2020-03-03
      • 2015-10-28
      相关资源
      最近更新 更多