10

我有一个带有字段的实体

@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 没有更新?

4

3 回答 3

11

您需要更改列注释以包含可更新 = 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;
于 2012-09-02T15:16:35.210 回答
3

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

@UpdateTimestamp
private LocalDateTime editTimestamp;

@CreationTimestamp
private LocalDateTime creationTimestamp;

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

import org.hibernate.annotations.CreationTimestamp
import org.hibernate.annotations.UpdateTimestamp
import java.time.LocalDateTime
于 2021-01-04T19:19:28.600 回答
-1

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

于 2011-07-06T15:43:49.593 回答