【问题标题】:@UpdateTimestamp does not update the value on second save@UpdateTimestamp 不会在第二次保存时更新值
【发布时间】:2020-05-16 10:07:12
【问题描述】:

我有以下实体类

@Entity
@Builder
@Table(name = "foo")
@Data
@NoArgsConstructor
public class Foo {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  Long id;

  ...

  @Column(name = "created_at", updatable = false)
  @CreationTimestamp
  private Instant createdAt;

  @Column(name = "updated_at")
  @UpdateTimestamp
  private Instant updatedAt;

}

并期望createdAt 字段在第一个save() 操作上只设置一次,而updatedAt 字段将在每个save() 操作上更新。

但是,通过以下测试:

@Test
public void shouldUpdateFieldUpdatedAt() {
    var savedFoo = fooRepository.save(new Foo());
    var firstUpdate = savedFoo.getUpdatedAt();
    var updatedFoo = fooRepository.save(savedFoo);
    assertThat(firstUpdate).isBefore(updatedFoo.getUpdatedAt());
}

它总是失败。我可以在调试中看到,对于两个不同的Foo 实例,updatedAt 字段是相同的。 我正在使用支持 Instant 类型的 Hibernate 5.3.7。所以,我不知道是什么问题......

数据库是 Postgres,具有下表:

CREATE TABLE IF NOT EXISTS foo (
  id SERIAL PRIMARY KEY,
  ...
  created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
);

【问题讨论】:

  • 在数据库中更新时更新?

标签: java hibernate spring-boot spring-data-jpa spring-data


【解决方案1】:

看起来问题可能与休眠缓存有关。 如果在两个 save() 操作之间我更新了一些其他字段,则测试通过并且 updatedAt 不同。

@Test
public void shouldUpdateFieldUpdatedAt() {
    var savedFoo = fooRepository.save(new Foo());
    var firstUpdate = savedFoo.getUpdatedAt();
    savedFoo.setTitle("New Title");
    var updatedFoo = fooRepository.save(savedFoo);
    assertThat(firstUpdate).isBefore(updatedFoo.getUpdatedAt());
}

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多