当手动分配ID时,Spring Data MongoDB Annotation @CreatedDate不起作用

我正在尝试使用审计来在我的对象中保存dateCreateddateUpdated ,但由于我手动设置了ID ,所以还有一些额外的工作。

遵循Oliver Gierke在DATAMONGO-946中的建议,我试图找出如何正确实现它。

作为上面Jira任务的原始海报,我从这里下载了示例https://github.com/spring-guides/gs-accessing-data-mongodb.git并对其进行了一些修改:

 package hello; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.domain.Persistable; import java.util.Date; public class Customer implements Persistable { @Id private String id; @CreatedDate private Date createdDate; @LastModifiedDate private Date lastModifiedDate; private String firstName; private String lastName; private boolean persisted; public Customer() { } public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public void setPersisted(boolean persisted) { this.persisted = persisted; } @Override public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean isNew() { return !persisted; } @Override public String toString() { return String.format( "Customer[id=%s, createdDate=%s, lastModifiedDate=%s, firstName='%s', lastName='%s']", id, createdDate, lastModifiedDate, firstName, lastName); } } 

 package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.mongodb.config.EnableMongoAuditing; @SpringBootApplication @EnableMongoAuditing public class Application implements CommandLineRunner { @Autowired private CustomerRepository repository; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) throws Exception { repository.deleteAll(); // create a customer Customer c = new Customer("Alice", "Smith"); c.setId("test_id"); // save a customer repository.save(c); // fetch all customers System.out.println("Customers found with findAll():"); System.out.println("-------------------------------"); for (Customer customer : repository.findAll()) { System.out.println(customer); } System.out.println(); // create another customer with same id c = new Customer("Bob", "Smith"); c.setId("test_id"); c.setPersisted(true); repository.save(c); // fetch all customers System.out.println("Customers found with findAll():"); System.out.println("-------------------------------"); for (Customer customer : repository.findAll()) { System.out.println(customer); } System.out.println(); } } 

执行的结果是这样的:

 Customers found with findAll(): ------------------------------- Customer[id=test_id, createdDate=Wed Feb 24 00:43:47 WITA 2016, lastModifiedDate=Wed Feb 24 00:43:47 WITA 2016, firstName='Alice', lastName='Smith'] Customers found with findAll(): ------------------------------- Customer[id=test_id, createdDate=null, lastModifiedDate=Wed Feb 24 00:43:47 WITA 2016, firstName='Bob', lastName='Smith'] 

对象更新后, createdDate变为null

我在这里想念的是什么? 如何正确实施Persistable使审计工作正常?

您的代码按预期工作。 在实现Persistable您可以看到@CreatedDate注释正在运行。

确定createdDate第二次变为null ,因为对象已经存在于数据库中,并且您使用createdDate = null更新它。 正如您从@CreatedDate文档中@CreatedDate

@CreatedDate注释。 这标识了当实体第一次持久保存到数据库时设置其值的字段。

因此,要在第二次调用时不使用null覆盖您的createdDate ,您应该使用c = repository.findOne("test_id");从数据库中检索您的客户c = repository.findOne("test_id"); 然后更新它。