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

Java 设置用@CreationTimestamp注释的字段的值,java,hibernate,spring-boot,jpa,spring-data-jpa,Java,Hibernate,Spring Boot,Jpa,Spring Data Jpa,我有一个实体,它有一个用@CreationTimestamp注释的字段: @Entity @Table(name = "foo") class Foo { ... @Column @CreationTimestamp private Instant createdAt; } 现在我有了集成测试,我需要用不同的createdAttimestamp创建一些条目。但当我将该值设置为我需要的值并保存时,它将被VM的创建时间戳覆盖: Foo foo = new Foo(); foo.se

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

@Entity
@Table(name = "foo")
class Foo {
  ...
  @Column
  @CreationTimestamp
  private Instant createdAt;
}
现在我有了集成测试,我需要用不同的
createdAt
timestamp创建一些条目。但当我将该值设置为我需要的值并保存时,它将被VM的创建时间戳覆盖:

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

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

我认为不可能在集成测试中根据需要禁用此行为

但是,您可以通过在保存实体后设置创建日期,然后再次保存实体以保持新的所需创建时间,从而使用变通方法实现相同的效果


这将起作用,因为只有在第一次保存实体时才会触发
@creationtimestap

我认为不可能在集成测试中禁用此行为,因为您需要在此处执行此操作

但是,您可以通过在保存实体后设置创建日期,然后再次保存实体以保持新的所需创建时间,从而使用变通方法实现相同的效果


这将起作用,因为只有在第一次保存实体时才会触发
@CreationTimestamp

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

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

当然,你可以在那里检查你想要的任何东西。您仍然可以在字段上设置一个
updateable=false

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

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

当然,你可以在那里检查你想要的任何东西。您仍然可以在字段上设置一个
updateable=false

foo.setCreatedAt(Instant.MIN);会考虑你的底层系统的时间戳。@ SCANQR是什么意思?如果我设置任何其他值,比如
Instant.now().减(1,ChronoUnits.DAYS)
foo.setCreatedAt(Instant.MIN),它的效果是一样的;会考虑你的底层系统的时间戳。@ SCANQR是什么意思?如果我设置任何其他值,例如
Instant.now().减(1,ChronoUnits.DAYS)
谢谢,它的工作原理是一样的。但是,如果我想将此字段标记为
updateable=false
谢谢,那么此解决方法将不起作用。但是,如果我想将此字段标记为
updateable=false
我正在考虑这个问题,实际上还有另一种方法,那么这种解决方法将不起作用。您可以使用
java.time
在测试中模拟过去(或将来)的运行。它有两个返回线程安全实现的静态方法。首先,您必须使用
Clock.fixed()
定义过去的点,然后使用
Clock.offset()
将系统时钟倒回到该点。从那里,创建并保存你的对象,然后回到现在。我在想这个问题,实际上还有另一种方法。您可以使用
java.time
在测试中模拟过去(或将来)的运行。它有两个返回线程安全实现的静态方法。首先,您必须使用
Clock.fixed()
定义过去的点,然后使用
Clock.offset()
将系统时钟倒回到该点。从那里,创建并保存对象,然后返回到“当前”。