2012-07-09 19 views
22

Stavo scorrendo parte della documentazione di Grails e ho trovato this bit sul metodo read() in Grails. Se sto capendo correttamente questo, è possibile estrarre una versione "di sola lettura" di un oggetto dal database che verrà salvato solo su una chiamata esplicita save(). Mi sembra quindi che dovresti usare una chiamata read() ogni volta che hai un oggetto che non ti aspetti di cambiare.Vantaggi di object.get() vs object.read() in Grails

Ma perché non dovresti usare sempre una chiamata read()? Dal momento che l'oggetto verrà modificato in permessi di lettura/scrittura se si utilizza lo strumento save(), non sarebbe più sicuro leggere semplicemente l'oggetto anziché ottenerlo?

risposta

17

Probabilmente hai ragione - sarebbe equivalente nella maggior parte dei casi. Ma Hibernate non richiede che chiami save() poiché fa un controllo sporco durante un flush e poiché Grails usa un intercettore "Open Session in View" ci sarà sempre un flush alla fine di ogni richiesta. Questo sorprende le persone che apportano modifiche in un'istanza recuperata da get() che erano destinate a essere solo temporanee durante il rendering della vista, ma poi le modifiche vengono mantenute comunque senza una chiamata save(). read() avrebbe più senso in quello scenario.

Un'ottimizzazione delle prestazioni è utilizzare http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html per inserire solo i campi modificati nel database. L'impostazione predefinita è di spingere tutti i campi, sia che siano cambiati o meno da allora, non è necessario generare nuovi SQL per ogni aggiornamento. Se si usa l'istanza di sospensione di un'istanza, non si mantengono i dati originali in modo tale che l'aggiornamento dinamico non sia possibile in quanto non ci sarebbe modo di sapere quali campi sono sporchi.

+0

Quindi se si legge() e si oppone e si apporta una modifica alla proprietà e l'intera sessione viene scaricata, quell'oggetto non verrà propagato al database corretto? L'oggetto verrebbe scaricato solo quando si chiama esplicitamente save() su quell'istanza. È corretto? – Viriato

+1

Corretto: in pratica disabilita il flush automatico, ma non disabilita il flush esplicito –