@CreatedDate注解字段没有写在Insert上,@LastModifiedDate是

@CreatedDate annotated field is not written on Insert, @LastModifiedDate is

我创建了以下实体并使用 h2 对其进行了测试:

@Getter
public class Topic {

    @Id
    private long id;

    private final Title title;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime lastModified;

    // ...
}

TopicRepository是一个空接口。

以下测试失败,错误为 createdAt 为空:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BasicRepositoryTests {

    @Autowired
    TopicRepository topicRepository;

    @Test
    public void topicRepositoryWorks() {
        val topic = new Topic();
        val savedTopic = topicRepository.save(topic);

        assertEquals(1, topicRepository.count());
        assertNotNull(savedTopic.getLastModified(), "lastModified must be set");
        assertNotNull(savedTopic.getCreatedAt(), "createdAt must be set");

        topicRepository.delete(savedTopic);

        assertEquals(0, topicRepository.count());
    }

}

我的申请被注释为 @SpringBootApplication@EnableJdbcAuditing

为什么createdAt还是null,而lastModified不为空?

编辑

我将 Topic.createdAtTopic.lastModified 的类型更改为 Instant,但没有用。

此外,我添加了以下方法,我猜它应该为 Instant 字段提供值:

@Bean
public AuditorAware<Instant> instantAuditorAware() {
    return () -> Optional.of(Instant.now());
}

遗憾的是,尽管调用了该方法,createdAt 仍然是 null

审核注解只考虑聚合根。如果作为聚合的一部分但不是聚合根的实体需要审计信息,这可以通过在聚合根中实现它来完成,聚合根应该管理对它和聚合的实体的所有更改。

虽然问题中发布的源代码表明您实际上正在查看聚合根,但您通过 Github 提供的代码表明根上的注释工作正常但非根实体上的注释不起作用' 如上所述。

您不需要 AuditorAware bean。 只有 @CreatedBy@LastModifiedBy.

才需要