-
jun17
-
mar10
-
mar05
Exprimiendo el belongsTo con múltiples relaciones bidireccionales
publicado por Enrique Medina Montenegro
3.843 visitas
Enrique Medina Montenegro
Con más de 14 años de experiencia en el mundo de las TI, donde comenzó desarrollando aplicaciones de escritorio en Delphi o Visual Basic, este Ingeniero en Informática por la Universidad de Alicante (1991-1996) ha ido perfilando su actividad profesional hacia las arquitecturas J2EE, donde siempre ha seguido muy atento, e incluso colaborado en ocasiones, con proyectos open-source como MyFaces, Spring, Hibernate, Groovy o Grails. Ocupando puestos desde Programador Junior hasta Arquitecto Senior de Soluciones, Enrique ha sido testigo de cómo ha ido evolucionando la tecnología en torno al desarrollo de aplicaciones web, adquiriendo un conocimiento y experiencia que le permiten evaluar con detalle las necesidades de cada proyecto y aplicar las herramientas que maximizan su productividad. Actualmente, Enrique se ha especializado en el framework de desarrollo Grails, y ejerce la Dirección Técnica de proyectos basados, entre otras, en esta tecnología.
Una de las cosas que más me gustan en Grails son la multitud de “perlas” que ofrece a los desarrolladores. En algunos casos se asemejan hasta a “huevos de pascua” porque no se encuentran documentadas y, desde luego, son de suma utilidad para el que las descubre. Aquí no vamos a descubrir ningún “huevo de pascua“, pero sí una de esas “perlas” que nos va a ayudar mucho en aquellos casos en que necesitemos llevar un seguimiento sencillo de la última vez que se modificó algún objeto en la base de datos (BD).
Cuando utilizamos GORM, Grails hace mucho trabajo sucio por nosotros; pero además, nos ofrece la posibilidad de “sellar” nuestros datos indicando en qué fecha fueron creados y cuándo fue la última vez que se modificaron (timestamping en inglés). Aunque se trata de una auditoría muy liviana, puede ser muy útil en determinados casos; y como de todas formas es “gratis“…
Así, pues, tenemos varias posibilidades: delegar toda la gestión a GORM, compartir la gestión con GORM, y por último, decir a GORM que seremos nosotros quienes lo gestionaremos todo. Vamos a ver cada uno de los casos en detalle.
Todo tuyo, GORM
Cuando no tenemos unas necesidades específicas de control de cambios en nuestros datos, lo más rápido y sencillo es confiar en GORM. Para ello, tan fácil como declarar dos campos en cada una de las clases de nuestro dominio que queramos controlar:
class MiClaseControlada {
........
Date dateCreated
Date lastUpdated
static constraints = {
}
}
Y eso es todo… A partir de este momento, Grails automáticamente creará esos dos campos en la BD y, cada vez que se cree o modifique una instancia de la clase, se ocupará de forma transparente de incluir dichos campos en el comando SQL correspondiente. ¿Se puede pedir más?
Unir fuerzas con GORM
Sin embargo, siempre nos encontramos casos en que, de alguna forma, necesitamos influir o cambiar el comportamiento por defecto de Grails. Pues bien, igual de sencillo que en el caso anterior: llegan los eventos al rescate.
beforeInsert
Evento que se ejecuta justo antes de que un objeto se guarde en BD. Por ejemplo:
class MiClaseControlada {
Date dateCreated
Date lastUpdated
def beforeInsert = {
dateCreated = new Date()
}
}
beforeUpdate
Evento que se ejecuta justo antes de que un objeto se actualice en BD. Por ejemplo:
class MiClaseControlada {
Date dateCreated
Date lastUpdated
def beforeInsert = {
dateCreated = new Date()
}
def beforeUpdate = {
lastUpdated = new Date()
}
}
beforeDelete
Evento que se ejecuta justo antes de que un objeto se elimine de la BD. Por ejemplo:
class MiClaseControlada {
Date dateCreated
Date lastUpdated
def beforeDelete = {
println "Eliminando objeto de tipo MiClaseControlada con ID = $id"
}
}
onLoad
Evento que se ejecuta cuando un objeto se carga de la BD. Por ejemplo:
class MiClaseControlada {
Date dateCreated
Date lastUpdated
def onLoad = {
println "Objeto de tipo MiClaseControlada con ID = $id acaba de ser cargado"
}
}
Déjame a mi sólo, GORM
Por último, si lo que necesitamos es tener control total sobre este proceso, se lo decimos a Grails y seguro que no se enfada:
class MiClaseControlada {
Date dateCreated
Date lastUpdated
static mapping = {
autoTimestamp false
}
}
Como se ha explicado a lo largo de este breve artículo, GORM proporciona toda la flexibilidad que el desarrollador quiera y necesite, actuando de forma transparente para quitarnos trabajo o bien cediéndonos el control para que nosotros decidamos en cada momento qué queremos hacer. A mi particularmente me fascina, pero para gustos los colores…



(2 votos, media: 3,50)
Entradas relacionadas
Comentarios recientes