2012-05-18 11 views
14

Ich habe an einem RESTful Webservice mit Feder-Daten gearbeitet. Vor ein paar Tagen ein spezielles Frühjahr-Daten-Jpa REST-Framework was released.Verwenden von @Version im Frühjahr-Daten-Projekt

Jetzt bemerkte ich die Möglichkeit, @Version mit diesem Framework zu verwenden. Wird diese Version selbst generiert oder müssen Sie dies manuell tun?

Und ist es möglich, @Version zu verwenden? (So ​​dass ich nichts zu meinen vorhandenen Repositories/Domäne usw. ändern muss.)

Und muss ich einige zusätzliche Konfiguration vornehmen, um @Version zu verwenden?

Antwort

34

Es ist eine Weile her, seit ich diese Frage geschrieben habe, aber ich habe es herausgefunden. Ich werde erklären, was ich getan habe, damit es für jemand anderen hilfreich ist.

Die Annotation @Version ist eine javax.persistence-Schnittstelle und nicht das Spring-Data-Rest-jpa-Framework, wie ich bereits erwähnt habe.

Wenn Sie von @Version machen wollen, müssen Sie ein Versionsfeld in Ihrem Domain-Objekt erstellen, etwa so:

@Version 
@Column(name = "VERSION") 
private long version; 

Wenn Sie es mit Hibernate automatisch pickup die Anmerkung und es wird erstellen eine Zeile "Version" in Ihrer (in meinem Fall MySql) Tabelle. Jedes Mal, wenn ein Datensatz aktualisiert wird, erhöht der Ruhezustand den Zähler um 1.

Nun, warum ist das etwas, was Sie wollen? Nun, der Grund, warum Sie dies verwenden möchten, ist, weil es die Wahrscheinlichkeit verringert, dass Ihre Kunden mit stale data arbeiten. Wenn ein Client Informationen von Ihnen abruft, wird eine Version mit den von ihm angeforderten Daten bereitgestellt. z.B.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "De regenboog", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Wenn nun ein Kunde will einige Informationen über diesen bestimmten Datensatz ändern, sendet er die neuen Informationen zusammen mit dem Versionswert. In diesem Fall ändern wir den Namen der Schule.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "Stackoverflow", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Hibernate erstellt eine Abfrage mit Ihren Informationen und fügt eine zusätzliche Where-Klausel hinzu, um die Version zu überprüfen. update .... where id = 1 and version = 0. Jetzt, wenn die Zeile aktualisiert wird, bedeutet dies, dass Sie die richtige Version zur Verfügung gestellt haben und niemand anderes diese spezifischen Informationen zwischen dem Zeitpunkt geändert hat, an dem Sie die Informationen angefordert, geändert und zurückgeschickt haben. Schön, oder?

Was nun, wenn die Zeile nicht aktualisiert wird? Es bedeutet, dass jemand anderes diese Zeile aktualisiert hat, während Sie eine kurze Pause gemacht haben, nachdem Sie die Informationen angefordert haben. Es bedeutet, dass Ihre Version veraltet ist! Was jetzt passieren muss, ist wirklich anwendungsfallspezifisch, so dass ich nicht näher darauf eingehen werde :)

Hoffe, dass jemand diese Information nutzen kann!

Dank all

+0

Das macht Sinn.Es hat definitiv geholfen.Vielen Dank – kalz

1

Stellen Sie sicher, ein Import javax.persistence.Version

und nicht die Feder zu importieren.

+0

Ich habe bereits hinzugefügt, dass meine Antwort: "Die Anmerkung @Version ist ein javax.persistence-Schnittstelle und nicht die Frühjahr-Daten Rest jpa Rahmen wie ich bereits erwähnt." –

+1

Wichtig zum Hinweisgrund.Spring @ Version-Annotation ist für alles außer JPA. Siehe http://stackoverflow.com/a/31883006/328808. –

Verwandte Themen