@CreatedDate带注释的字段未写在Insert上,@ LastModifiedDate是

时间:2019-06-11 11:28:04

标签: java spring spring-data auditing spring-data-jdbc

我创建了以下实体,并使用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

1 个答案:

答案 0 :(得分:1)

仅对聚合根考虑审核注释。如果属于聚合而不是聚合根的实体需要审核信息,可以通过在聚合根中实现该信息来实现,该信息应管理对它和聚合实体的所有更改。

问题中发布的源代码表明您实际上正在查看聚合根,但通过Github提供的代码显示,根上的注释可以正常运行,但非根实体上的注释则不能如上所述。

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