【发布时间】: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