miércoles, 19 de enero de 2011

GRAILS - get, read o load?

A la hora de obtener un objeto de dominio, ¿qué metodo debemos utilizar, read, get o load?.

Antes de empezar con la explicación he de decir que hasta que leí el artículo del observatorio de grails no conocía el método read, y también me vino bien para aclarar algún que otro concepto.

Los tres métodos mencionados nos permiten obtener instancias de una clase de dominio mediante su id, pero lo que obtenemos y lo que podemos hacer con la instancia varía en cada uno de ellos.

El método read() nos devuelve una instancia de sólo lectura y, en caso de que no exista ninguna por el id que proporcionamos, devuelve null. ¿Qué implica esto? Simplemente que podemos leer las propiedades de la instancia del objeto pero no podremos modificar ninguna.

def empresa = Empresa.read(1)
if (empresa)
{
   println empresa.nombre // salida: Empresa
   empresa.nombre = "Empresa cambiada de nombre"
   empresa.save() // dará error porque la instancia es de sólo lectura
}

Si queremos obtener una instancia modificable, el método get() es el que necesitamos. El resultado es igual que al utilizar el método read(), salvo que sí podremos modificar los valores de las propiedades.

def empresa = Empresa.get(1)
if (empresa)
{
   println empresa.nombre // salida: Empresa
   empresa.nombre = "Empresa cambiada de nombre"
   empresa.save() // no dará error porque la instancia es modificable
}

También tenemos el método load() que devuelve un proxy, cargando el objeto sin realmente instanciarlo. El objeto se instanciará cuando intentemos acceder a alguna propiedad distinta del id. Según el artículo del observatorio de grails, es útil en términos de rendimiento y optimización de acceso a datos.

Empresa.load(1).delete()

Claro que la utilización de este método también tiene sus contras. No os recomiendo utilizar load() cuando el objeto lo vayáis a utilizar fuera del método que lo ha cargado y, por tanto, fuera de la sesión de hibernate en la que se creó el proxy, ya que no os permitirá acceder a las propiedades del objeto (exceptuando el id) y os dará un error. Si no me equivoco será porque, al haber terminado la sesión de hibernate en la que se creó el proxy, ya no puede cargar realmente la instancia al tratar de acceder a alguna propiedad que no sea el id.
Generalmente yo utilizo este método para cargar los objetos que sólo voy a utilizar como parámetros en búsquedas o, como aparece en el ejemplo anterior, para realizar borrados.

def sector = Sector.load(1)
def empresas = Empresa.findAllBySector(sector)

2 comentarios:

Es un pequeño detalle, cuando comentas lo del método READ tienes en tu ejemplo el metodo GET

def empresa = Empresa.get(1)

debería ser

def empresa = Empresa.read(1)

Gracias por la info

Muchas gracias por la puntualización.
Ya está cambiado :)

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More