关于更新CURRENT_TIMESTAMP和JPA

ylamdve6  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(125)

我有一个带字段的实体

@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仍然保持不变。

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


edit_timestamp更新。如果我添加

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


它工作w/o问题.我的问题是为什么w/o @PreUpdate的edit_timestamp没有更新?

3ks5zfa0

3ks5zfa01#

您需要更改列注解以包含updatable = 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;

字符串

1yjd4xko

1yjd4xko2#

你可以在你的实体中将变量标记为更新或创建时间戳。在下面的例子中,你可以看到如何使用hibernate annotations非常容易地做到这一点:

@UpdateTimestamp
private LocalDateTime editTimestamp;

@CreationTimestamp
private LocalDateTime creationTimestamp;

字符串
只是为了参考,并确保没有混淆,我使用以下包导入各自的数据库和注解:

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

4xrmg8kj

4xrmg8kj3#

这里“created_date”字段默认设置在mysql与default/expression是“CURRENT_TIMESTAMP”see image file here.和在你的实体类如下-

private Date updated_date;

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

      @Temporal(TemporalType.TIMESTAMP)
      public Date getUpdated_date() {
           return updated_date;
      }

      public void setUpdated_date(Date updated_date) {
           this.updated_date = updated_date;
      }

字符串

5cg8jx4n

5cg8jx4n4#

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

相关问题