Java @CreatedDate注释字段未写入Insert,@LastModifiedDate为
我创建了以下实体,并使用h2对其进行了测试:Java @CreatedDate注释字段未写入Insert,@LastModifiedDate为,java,spring,spring-data,auditing,spring-data-jdbc,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; // ... } Top
@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());
}
}
我的应用程序用@springbootplication
和@EnableJdbcAuditing
注释
为什么createdAt
仍然null
,lastModified
另一方面不为null
编辑
我将Topic.createdAt
和Topic.lastModified
的类型更改为Instant
,但这不起作用
此外,我还添加了以下方法,我想应该为Instant
字段提供值:
@Bean
public AuditorAware<Instant> instantAuditorAware() {
return () -> Optional.of(Instant.now());
}
@Bean
公共AuditorAware instantAuditorAware(){
return()->Optional.of(Instant.now());
}
遗憾的是,尽管调用了该方法,
createdAt
仍然是null
,但审计注释只考虑用于聚合根。如果作为聚合的一部分而不是聚合根的实体需要审核信息,可以通过在聚合根中实现它来完成,聚合根应该管理对它和聚合实体的所有更改
虽然问题中发布的源代码表明您实际上正在查看聚合根,但您通过Github提供的代码显示,根上的注释工作正常,但非根实体上的注释工作不正常,如上所述
您不需要AuditorAware
bean。
这仅适用于
@CreatedBy
和@LastModifiedBy
可能重复的@SudhirOjha,谢谢您的回复。我希望它不是重复的,因为我想使用spring数据jdbc
,而不是jpa
。你能创建一个github存储库来复制它吗?我创建了一个项目来演示我的案例,结果成功了。在写这个问题之前,我使用了UUID
s而不是long
s,并实现了一个BeforeSave
事件侦听器来创建它们。是不是它干扰了有关CreatedDate
注释的任何内容,可能吞没了事件?@jenschauder我在这里上传了我的演示项目:github.com/joshavg/created-at-sdjdbc聚合的子实体Reply没有编写CreatedDate。这可能是因为子实体先被删除,然后在修改时重新插入?