【发布时间】:2019-10-25 19:36:18
【问题描述】:
我创建了以下实体并使用 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。
【问题讨论】:
-
@SudhirOjha 感谢您的回复。我希望它不是重复的,因为我想使用
spring-data-jdbc,而不是jpa。 -
你能创建一个 github 存储库来重现这个吗?
-
我创建了一个项目来演示我的案例,结果很有效。在写这个问题之前,我使用
UUIDs 而不是longs 并实现了一个BeforeSave事件监听器来创建它们。会不会是它干扰了关于CreatedDate注释的任何事情,可能吞没了这个事件? -
@JensSchauder 我在这里上传了我的演示项目:github.com/joshavg/created-at-sdjdbc Aggregate 的子实体 Reply 没有写入 CreatedDate。可能是因为子实体先被删除,然后在修改时重新插入?
标签: java spring spring-data auditing spring-data-jdbc