我创建了以下实体,并使用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.createdAt
和Topic.lastModified
的类型更改为Instant
,这是行不通的。
我还添加了以下方法,我猜应该为Instant
字段提供值:
@Bean
public AuditorAware<Instant> instantAuditorAware() {
return () -> Optional.of(Instant.now());
}
可悲的是,尽管调用了该方法,但createdAt
仍然是null
。
答案 0 :(得分:1)
仅对聚合根考虑审核注释。如果属于聚合而不是聚合根的实体需要审核信息,可以通过在聚合根中实现该信息来实现,该信息应管理对它和聚合实体的所有更改。
问题中发布的源代码表明您实际上正在查看聚合根,但通过Github提供的代码显示,根上的注释可以正常运行,但非根实体上的注释则不能如上所述。
您不需要AuditorAware
bean。
只有@CreatedBy
和@LastModifiedBy
才需要。