2009-12-03 19 views
15
@Entity 
public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    private int salary; 

    @Version 
    private long version; 

    // ...getters and setters 
} 
  1. E 'necessario creare setter/getter per version?
  2. Quando si mantiene questa entità con Hibernate, non è necessario impostare questo valore manualmente, giusto?
  3. Cos'altro devo configurare per utilizzare il controllo ottimistico della concorrenza con Spring hibernateTemplate.saveOrUpdate? Tutti i database sono supportati?
  4. Come testare questa entità? Nel mio database tutti i miei record che mostrano il campo della versione hanno il valore di 0
  5. Chiamando hibernateTemplate.saveOrUpdate incrementerà il valore della versione ogni volta?

risposta

12

direi: è richiesto

  1. set/ottenere la versione, come si potrebbe assegnare la versione da soli a volte (quando ricreare una nuova istanza da vecchi dati)
  2. Non è necessario se leggi l'istanza dal database. (Quando si crea nel codice con il nuovo, sarebbe una storia diversa).
  3. Non vedo nient'altro. Non ho mai avuto problemi con un database.
  4. I test di unità non vanno nel database a mio parere, quindi i test che coinvolgono il database sono chiamati test di integrazione. Non dovresti averne troppo, dato che sono lenti e non testano realmente il tuo codice, ma più i codici Hibernate/Driver/Database ... dovresti fidarti di loro, o semplicemente testarli una volta, ma non per tutte le tue entità.
    Per vedere i valori della versione più di 0, leggere/modificare/aggiornare la propria entità in una transazione, la versione aumenta di uno. Esci dalla transazione, fallo di nuovo, il valore aumenta ...
  5. La versione aumenterà ogni volta che la riga del database viene modificata.
+0

@KLE in caso di chiamata da 2 utente hibernatetemplate.saveorupdate allo stesso tempo, non è necessario effettuare un controllo extra quando la chiamata chiama hibernatetemplate.saveorupdate? qualche eccezione lancia? – cometta

+1

@cometta Il punto non è quello di salvare o meno, ma da dove provengono i dati. In una transazione ** se leggi un'entità dal database **, le informazioni sulla versione sono aggiornate. Quando lo salvi, viene gestito automaticamente. Se un giorno ti capita di ottenere i dati da un'altra fonte (ad esempio il post di un modulo) e ricreare l'entità, allora devi occuparti della versione da te. – KLE

+0

Una spiegazione abbastanza buona è qui: http://en.wikibooks.org/wiki/Java_Persistence/Locking – Zilvinas