DTO e JPA Version

1

Ho tabelle DB che rappresentano dipendenti e dipartimenti. Il lato server (JavaEE) contiene entità JPA che rappresentano lo stesso.

Il client è un client autonomo e comunica con il server tramite DTO. Nel mio caso, un singolo DTO contiene sia i dati Employee che Dept.

Voglio implementare il blocco ottimistico usando l'annotazione della versione su queste entità, ma c'è un problema: quando il client invia il DTO con i valori aggiornati al metodo server (webservice), il metodo server crea entità utilizzando i valori in il DTO e poi trova l'entità utilizzando il metodo find () su JPA e quindi chiama update (). Non c'è molto divario tra find () e update ().

Ma il problema è che il valore proveniente dal DTO stesso potrebbe essere obsoleto. Dal momento che sto usando un client standalone, non ho il contesto delle entità JPA del server. JPA stesso non riesce a trovare che il valore sia vecchio (perché la versione tra find () e update () corrisponde) e sovrascrive l'entità con dati non aggiornati. C'è un modo per risolvere questo problema?

    
posta KDK 18.06.2015 - 13:38
fonte

1 risposta

2

Il blocco ottimistico utilizzando i numeri di versione si basa sul principio che tu sai quale versione dei dati è stata recuperata dal database prima di apportare modifiche, in modo da poter verificare che non siano stati effettuati aggiornamenti intermedi tra il recupero di un'entità e scrivendo le modifiche indietro.

Perché funzioni, il numero di versione deve essere parte integrante dell'entità (e deve essere modificato solo dal database). Ciò significa che il numero di versione deve anche essere comunicato nel DTO al client, preferibilmente come attributo di sola lettura.

Se il numero di versione fa parte del DTO, è possibile rilevare i dati obsoleti in due modi:

  1. Il metodo find controlla il numero di versione rispetto alla versione corrente dell'entità e segnala "mancata corrispondenza della versione dell'entità" quando i due non corrispondono.
  2. Il metodo update fallisce se la versione dell'entità non corrisponde al numero di versione nel database. Per evitare condizioni di gara, questo controllo deve sempre essere eseguito, anche se la funzione find controlla anche il numero di versione.

Se hai rilevato dati obsoleti, puoi reagire in diversi modi:

  1. Segnala un errore e consenti all'utente di aggiornare l'entità e reinserire le sue modifiche
  2. Segnala il conflitto all'utente e fagli convertire le sue modifiche nella nuova versione dell'entità (mostrando cosa è stato modificato esternamente e cosa è stato modificato dall'utente).
  3. Prova a eseguire un'unione automatica e, se non funziona, torna a 2 (ad esempio se sono state apportate più modifiche allo stesso campo).
risposta data 18.06.2015 - 16:54
fonte

Leggi altre domande sui tag