2015-08-19 6 views
5

Sto passando attraverso Spring Data MongoDB - Reference Documentation e sto trovando gli esempi per essere un po 'troppo semplicistico.Come utilizzare il blocco ottimistico con Spring Data MongoDB?

In particolare sto cercando di capire come gestire i dati obsoleti in ambienti concorrenti. Per esempio, immaginate Ho la seguente entità:

public class Person { 

    private final String username; 
    private final String firstname; 
    private final String lastname; 

    [...] 

} 

Ora, se io uso CrudRepository di salvare/aggiornare/rimuovere le entità, quindi immaginare uno scenario in cui due thread recuperare la stessa entità, uno di loro lo rimuove, e l'altro aggiorna il suo campo lastname. Se la chiamata delete viene completata prima della chiamata save, la mia entità verrà rimossa e quindi ricreata, quando il comportamento previsto sarà per l'operazione save non riuscita.

Finora ho visto due opzioni per ottenere intorno a questo problema:

  1. Usa @Version annotazione. Non è stata trovata alcuna documentazione che dicesse che Spring Data supporta il blocco ottimistico in MongoDB usando documenti con versione. Se qualcuno può indicarmi un link, sarebbe apprezzato.
  2. Utilizzare MongoOperations.findAndModify e fallire se restituisce null. Lo svantaggio di questo approccio è che non riesco più a implementare la mia API di repository per avere il tipo "ottieni entità" e "salva entità aggiornata" della semantica. ad esempio:

    User user = userRepository.findByUsername("uniqueUsername"); 
    user.setLastName("Archer"); 
    userRepository.update(user); 
    

avrei dovuto spingere alcune di queste al repository immagino:

userRepository.updateLastname("uniqueUsername", "Archer"); 

Ma io sono un po 'preoccupato mie interfacce repository crescerà in maniera incontrollata se ogni tipo di aggiornamento che voglio fare richiede un nuovo metodo.

Mi rendo conto che in realtà non ho ancora fatto una domanda, quindi ecco qui: qual è la migliore pratica per la progettazione di un'applicazione che utilizza Spring Data per MongoDB?

risposta

5

Utilizzare @org.springframework.data.annotation.Version in una proprietà dovrebbe fare il trucco. Ho creato DATAMONGO-1275 per migliorare la documentazione su questo.

+0

Se ho capito bene questo getterà un OptimisticLockException solo durante l'aggiornamento giusto? È possibile anche supportare l'eliminazione? – kukudas