Spring Data MongoDB Annotation @CreatedDate nicht funktioniert, wenn die ID manuell vergeben
Ich versuche, die die überwachung verwenden, um zu speichern dateCreated
und dateUpdated
in meine Objekte, aber da ich ID
manuell, es gibt einige zusätzliche Arbeit.
Folgenden Oliver Gierke ' s Vorschlag in DATAMONGO-946
Ich versuche, herauszufinden, wie man korrekt umzusetzen.
Als original-poster in Jira task-oben hab ich runtergeladen Beispiel von hier https://github.com/spring-guides/gs-accessing-data-mongodb.git und Sie ein bisschen verändert:
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);
}
}
und
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();
}
}
und ein Ergebnis der Ausführung ist:
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
wird null
nach Objekt aktualisieren.
Was vermisse ich hier? Und wie richtig zu implementieren Persistable
zu machen, auditing arbeiten, richtig?
InformationsquelleAutor and_rew | 2016-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr code wie erwartet funktioniert. Nachdem Sie implementiert haben
Persistable
können Sie sehen, dass@CreatedDate
annotation funktioniert.Sicher, dass
createdDate
istnull
auf den zweiten Anruf vonsave
weil das Objekt bereits in der Datenbank vorhanden ist und aktualisieren Sie es mitcreatedDate = null
. Wie Sie sehen können aus der Dokumentation für@CreatedDate
:Also nicht überschreiben Ihre
createdDate
mitnull
auf den zweiten Anruf sollten Sie abrufen, Ihre Kunden aus der Datenbank mitc = repository.findOne("test_id");
und dann update es.Also @CreatedDate wie erwartet funktioniert es automatisch generieren createdDate für Sie auf dem ersten speichern und nach dem zweiten mal Kunde bereits in der Datenbank mit der entsprechenden id. Es wäre falsch, wenn neue createdDate erzeugt würden, die auf der zweiten speichern. Für update-Kunden, wie ich sagte, Sie sollten es zuerst erhalten aus der Datenbank.
Ja, natürlich. Für das nächste update da ist
@LastModifiedDate
, die automatisch auf update. Ich dachte nur, dass ein Feld markiert mit@CreatedDate
würde automatisch übersprungen werden, auf update. Trotzdem danke!Ich Stimme mit and_rew. Ich erwartete das Feld annotationed mit @CreatedDate gesetzt werden, die mit dem ursprünglichen Datum einfügen, und zu halten, die Wert auf nachfolgende updates. Warum zum Teufel will ich das Datum entfernt auf updates? Der springende Punkt bei der überwachung ist zu halten, dass die Informationen.
Sie versuchen, erstellen ein neues Objekt mit derselben ID und erwarten zu bekommen, ERSTELLUNGSDATUM von alten Objekt. Sie haben hier zwei Optionen: 1. Holen Sie sich Objekt-id, update einige Felder und speichern Sie es dann. 2. Schreiben Sie eine Methode, um zu aktualisieren, nur Feld, das Sie brauchen. Ich denke, das beste wird die zweite option, um sicherzustellen, dass Sie einige Felder nicht zu überschreiben
InformationsquelleAutor Orest