2012-07-09 9 views
22

Estaba revisando parte de la documentación de Grails y encontré this bit sobre el método read() en Grails. Si estoy entendiendo esto correctamente, puede extraer una versión de "solo lectura" de un objeto de la base de datos que solo se guardará en una llamada explícita save(). Me parece entonces que debe usar una llamada read() siempre que tenga un objeto que no espera cambiar.Beneficios de object.get() vs object.read() en Grails

Pero, ¿por qué no usarías siempre una llamada read()? Dado que el objeto se cambiará para leer/escribir permisos si save() de todos modos, ¿no sería más seguro leer en el objeto en lugar de leerlo?

Respuesta

17

Probablemente esté en lo correcto, sería equivalente en la mayoría de los casos. Pero Hibernate no requiere que llame al save(), ya que hace una comprobación sucia durante una descarga y dado que Grails usa un interceptor de "Abrir sesión en la vista", siempre habrá un color al final de cada solicitud. Esto sorprende a las personas que realizan cambios en una instancia recuperada por get(), que estaban destinados a ser temporales mientras se procesa la vista, pero luego los cambios se mantienen de todos modos sin una llamada save(). read() tendría más sentido en ese escenario.

Una optimización del rendimiento consiste en utilizar http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html para insertar únicamente los campos modificados en la base de datos. El valor predeterminado es presionar todos los campos, cambien o no, ya que no es necesario generar un nuevo SQL para cada actualización. Si read() una instancia Hibernate no mantiene los datos originales, entonces la actualización dinámica no sería posible, ya que no habría forma de saber qué campos están sucios.

+0

Entonces, si lee() y objeta y realiza un cambio de propiedad y se enjuaga toda la sesión, ¿ese objeto no se propagará a la base de datos? El objeto solo se enrojecerá cuando llame explícitamente a save() en esa instancia. ¿Es esto correcto? – Viriato

+1

Correcto: básicamente deshabilita el lavado automático, pero no inhabilita el enjuague explícito –

Cuestiones relacionadas