2012-05-18 19 views
14

Ho lavorato a un webservice RESTful con i dati di primavera. Pochi giorni fa una speciale struttura JEST REST primavera-dati was released.Utilizzo di @Version nel progetto di dati di primavera

Ora ho notato la possibilità di utilizzare @Version con questo framework. Questa versione è generata da sola o hai bisogno di farlo manualmente?

Ed è possibile utilizzare @Version su proprio? (In modo che non debba modificare nulla per i miei repository/domini esistenti ecc.)

E ho bisogno di fare qualche configurazione extra per utilizzare @Version?

risposta

34

È passato un po 'di tempo da quando ho postato questa domanda, ma l'ho capito. Spiegherò cosa ho fatto in modo che possa essere utile a qualcun altro.

L'annotazione @Version è un'interfaccia javax.persistence e non il framework jpa di spring-data rest come menzionato in precedenza.

Se si vuole fare uso di @Version è necessario creare un campo di versione nell'oggetto dominio in questo modo:

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

Se stai usando hibernate lo farà automaticamente pick-up l'annotazione e creerà una riga "versione" nella tabella (nel mio caso MySql). Ogni volta che un record viene aggiornato, l'ibernazione incrementerà il contatore con 1.

Ora, perché questo è ciò che vuoi? Beh, la ragione per cui potresti voler usare questo è perché diminuisce le possibilità che i tuoi clienti stiano lavorando con stale data. Ogni volta che un cliente recupera informazioni da te viene fornita una versione con i dati richiesti. per esempio.

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

Ora, se un cliente vuole cambiare alcune informazioni su questo record specifico invia le nuove informazioni insieme al valore di versione. In questo caso cambiamo il nome della scuola.

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

Hibernate genera una query con le informazioni dell'utente e aggiunge una clausola aggiuntiva "where" per verificare la versione. update .... where id = 1 and version = 0. Ora se la riga è aggiornata significa che hai fornito la versione giusta e nessun altro ha modificato le informazioni specifiche tra il momento in cui hai richiesto le informazioni, l'hai cambiato e l'hai restituito. Bello vero?

Ora cosa succede se la riga non viene aggiornata? Significa che qualcun altro ha aggiornato quella riga mentre facevi una breve pausa per il bagno dopo aver richiesto le informazioni. Significa che la tua versione è obsoleta! Quello che deve accadere ora è davvero un caso specifico, quindi non entrerò nei dettagli a riguardo :)

Spero che qualcuno possa usare questa informazione!

Grazie a tutti

+0

Ciò ha senso. Mi ha sicuramente aiutato. Grazie – kalz

1

Assicurarsi di importare importazione javax.persistence.Version

e non la molla uno.

+0

Ho già aggiunto questo alla mia risposta: "L'annotazione @Version è un'interfaccia javax.persistence e non il framework jpa di spring-data rest come menzionato in precedenza." –

+1

Importante per il motivo della nota.L'annotazione Spring @Version riguarda tutto tranne JPA. Vedi http://stackoverflow.com/a/31883006/328808. –

Problemi correlati