@UpdateTimestamp不会在第二次保存时更新值

时间:2020-05-16 10:07:12

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

我具有以下实体类

@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字段是相同的。 我正在使用Hibernate 5.3.7,它确实支持Instant类型。所以,我不知道这是什么问题...

该数据库是具有下表的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,
);

1 个答案:

答案 0 :(得分:0)

看起来问题可能出在休眠缓存上。 如果在两次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());
}
相关问题