当手动分配 ID 时,Spring Data MongoDB Annotation @CreatedDate 不起作用
我正在尝试使用审核将 dateCreated
和 dateUpdated
保存在我的对象中,但是由于我手动设置了 ID
,因此还有一些额外的工作.
I'm trying to use auditing to save dateCreated
and dateUpdated
in my objects, but since I set ID
manually, there's some additional work.
遵循 Oliver Gierke 在 DATAMONGO-946 中的建议我正在尝试弄清楚如何正确实现它.
Following Oliver Gierke's suggestion in DATAMONGO-946 I'm trying to figure out how to correctly implement it.
作为上述 Jira 任务中的原始海报,我已从此处下载示例 https://github.com/spring-guides/gs-accessing-data-mongodb.git 并稍作修改:
As original poster in Jira task above, I've downloaded example from here https://github.com/spring-guides/gs-accessing-data-mongodb.git and modified it a bit:
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<String> {
@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
,让审计正常工作?
What am I missing here? And how to correctly implement Persistable
to make auditing work properly?
推荐答案
您的代码按预期工作.实现 Persistable
后,您可以看到 @CreatedDate
注释正在工作.
Your code is working as expected. After you've implemented Persistable
you can see that @CreatedDate
annotation is working.
确保 createdDate
在第二次调用 save
时为 null
,因为该对象已存在于数据库中并且您使用 createdDate = null
.正如您从 @CreatedDate
的文档中看到的:
Sure that createdDate
is null
on the second call of save
because the object already exists in the database and you updated it with createdDate = null
. As you can see from the documentation for @CreatedDate
:
@CreatedDate 注释.这标识了其值被设置的字段当实体第一次持久化到数据库时.
@CreatedDate annotation. This identifies the field whose value is set when the entity is persisted to the database for the first time.
所以不要在第二次调用时用 null
覆盖您的 createdDate
,您应该使用 c = repository.findOne("test_id" 从数据库中检索您的客户);
然后更新它.
So not to overwrite your createdDate
with null
on the second call you should retrieve your customer from the database with c = repository.findOne("test_id");
and then update it.
相关文章