设置用@CreationTimestamp注释的字段的值

时间:2019-04-30 10:37:29

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

我有一个实体,该实体的字段用@CreationTimestamp注释:

@Entity
@Table(name = "foo")
class Foo {
  ...
  @Column
  @CreationTimestamp
  private Instant createdAt;
}

现在我有了集成测试,需要在其中创建一些具有不同createdAt时间戳记时间戳的条目。但是,当我将值设置为所需的值并保存时,它将被虚拟机的创建时间戳所覆盖:

Foo foo = new Foo();
foo.setCreatedAt(Instant.MIN);
foo = fooRepo.save(foo);
foo.getCreatedAt(); // equals to the creation time

如何在测试环境中为此字段插入所需的值?

2 个答案:

答案 0 :(得分:1)

我认为您不可能在集成测试中禁用此行为。

但是,您可以使用一种解决方法来实现此目的,方法是在保存实体之后设置创建日期,然后再次保存实体以保留新的所需创建时间。

这将起作用,因为@CreationTimestamp仅在首次保存实体时才会触发。

答案 1 :(得分:1)

您可以将其从字段中删除,并使用@CreationTimestamp来管理该日期,而不是使用@PrePersist批注:

@PrePersist
void onCreate() {
    this.setCreatedAt(Instant.now());
}

当然,您可以在其中检查任何内容。您仍然可以在该字段上输入updatable=false