2012-01-12 4 views
5

stiamo utilizzando la modalità di sospensione con blocco ottimistico. Tutte le nostre entità hanno l'annotazione @version.migliore strategia di aggiornamento su ibernazione stalestateException

Questo funziona correttamente, se un utente tenta di salvare un oggetto che è scaduto otteniamo una stalestateexception. Nel nostro caso vorremmo dare all'utente una schermata di notifica per scartare le sue modifiche o sovrascrivere i valori correnti nel database.

Questo caso di uso comune per le eccezioni di stato obsoleto. La mia domanda è correlata a questo caso d'uso. Qual è la strategia migliore se l'utente decide di sovrascrivere la riga corrente del database con le sue modifiche? Ho consultato la guida di riferimento di ibernazione e diversi siti Web, ma tutto ciò che viene menzionato è che devi prendere tu stessa l'idea di stalestate e quindi gestire la sovrascrittura dei dati in modo programmatico. Mi chiedo se Hibernate abbia alcune utilità per semplificare questa strategia, la cosa più semplice che posso ottenere se l'utente decide di sovrascrivere con i suoi dati sta recuperando l'ultima versione dell'entità dal database, quindi copia tutti i campi modificati su questo oggetto e quindi salvare l'oggetto modificato di nuovo nel database. Ma non posso smettere di chiedermi se non c'è una soluzione più elegante.

risposta

1

Non credo che Hibernate tenti di aiutarti con questo perché i requisiti in questo settore sono probabilmente molto complessi e su misura.

Immagino che se un utente dovesse salvare un oggetto che è stato modificato simultaneamente da un altro utente probabilmente non vorrà semplicemente caricare l'oggetto e copiare tutti i campi modificati e annullare tutte le altre modifiche degli utenti . Cosa succede se entrambi gli utenti hanno cambiato lo stesso campo? Dovresti presentare le due versioni all'utente e chiedergli di decidere quale versione è corretta. Un po 'come unire le modifiche in un sistema di controllo della versione.

Inoltre, è possibile avere una convalida del livello dell'interfaccia utente che collega i campi che potrebbero essere violati se si uniscono semplicemente due versioni della stessa entità nel back-end e lo si mantiene.

+0

In alcune occasioni creiamo effettivamente un 'unione ui'. Ma ci sono alcuni casi d'uso in cui i dati non sono abbastanza importanti da essere semplicemente sovrascritti, mi chiedevo se c'è qualche metodo predefinito per questo o se devi semplicemente scrivere l'algoritmo da solo. –

+0

Non che io sappia che ho paura. –

+1

È una bella domanda però. Ho passato un po 'di tempo a pensare al modo migliore per affrontare questa situazione! –

0

Nella mia esperienza, per introdurre un po 'di automazione in questo caso ho usato il seguente trucco. Ho ricaricato l'entità e impostato il valore dell'ultima versione da esso al mio oggetto non aggiornato che non è stato salvato prima. Poi ho fatto merge() passando il mio oggetto stantio. In questo modo tutti i campi vengono sovrascritti, la versione aggiornata e pronta per il salvataggio. Naturalmente tutti i riferimenti associati devono essere curati allo stesso modo.