@CreatedDate 注释字段没有写在 Insert 上,@LastModifiedDate 是
Posted
技术标签:
【中文标题】@CreatedDate 注释字段没有写在 Insert 上,@LastModifiedDate 是【英文标题】:@CreatedDate annotated field is not written on Insert, @LastModifiedDate is 【发布时间】: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
。
【问题讨论】:
@CreatedDate annotation does not work with mysql的可能重复 @SudhirOjha 感谢您的回复。我希望它不是重复的,因为我想使用spring-data-jdbc
,而不是 jpa
。
你能创建一个 github 存储库来重现这个吗?
我创建了一个项目来演示我的案例,结果很有效。在写这个问题之前,我使用UUID
s 而不是long
s 并实现了一个BeforeSave
事件监听器来创建它们。会不会是它干扰了关于CreatedDate
注释的任何事情,可能吞没了这个事件?
@JensSchauder 我在这里上传了我的演示项目:github.com/joshavg/created-at-sdjdbc Aggregate 的子实体 Reply 没有写入 CreatedDate。可能是因为子实体先被删除,然后在修改时重新插入?
【参考方案1】:
审核注释只考虑聚合根。如果作为聚合的一部分但不是聚合根的实体需要审计信息,这可以通过在聚合根中实现它来完成,聚合根应该管理对其和聚合的实体的所有更改。
虽然问题中发布的源代码表明您实际上是在查看聚合根目录,但您通过 Github 提供的代码显示根目录上的注释工作正常,但非根实体上的注释不像上述那样。
您不需要AuditorAware
bean。
只有@CreatedBy
和@LastModifiedBy
才需要。
【讨论】:
以上是关于@CreatedDate 注释字段没有写在 Insert 上,@LastModifiedDate 是的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data MongoDB - 使用自定义 Id 字段时注释 @CreatedDate 不起作用
Spring Data @CreatedDate 注释对我不起作用
简单的 Spring @CreatedDate 注释对我不起作用
如何在 Spring Boot 中使用 EnableJpaAuditing 注释在印度标准时间(即 UTC+05:30)中写入 @CreatedDate?