我具有以下实体类
@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,
);
答案 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());
}