gpt4 book ai didi

java - @UpdateTimestamp 不会更新第二次保存时的值

转载 作者:行者123 更新时间:2023-12-01 16:42:33 26 4
gpt4 key购买 nike

我有以下实体类

@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,
);

最佳答案

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

关于java - @UpdateTimestamp 不会更新第二次保存时的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61835088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com