SlideShare una empresa de Scribd logo
1 de 16
Groovy y Grails
Parte 2
Clases de Dominio
Definición y características
class Student {
String name
String lastname
String mail
static belongsTo = [university :
University]
static constraints = {
name blank: false
lastname blank:false
mail unique: true, email: true
}
}
• Métodos públicos por defecto
• Atributos privados por defecto
• Getters y Setters invocados sin estar
explicitos
• Mapeos contra la base de datos
• Relaciones con otras clases de dominio
• Constraints sobre atributos
• Constructor por defecto con parámetro
Map
• Métodos dinámicos para búsquedas
Constraints
 Son configuraciones escritas en un DSL para Grails que permiten realizar
validaciones sobre las clases de dominio
 Algunas de las más utilizadas:
• blank
• email
• inList
• max/min
• size/maxSize/minSize
• range
• unique
Mapeo entre clases de Dominio
• Permiten establecer relaciones bidireccionales
• Especifican el comportamiento del ORM al guardar o borrar instancias de
clases de dominio
• Permite a Grails generar las tablas intermedias para las relaciones
• Las instancias que son referenciadas en el hasMany se almacenan por default
en la clase Set de Java.
Relaciones one-to-one
class Face {
Nose nose
}
class Nose {
static belongsTo = [face : Face]
}
--------------------------------------------------
//Las llamdas a save o delete en Face van a aplicarse en cascada sobre Nose
new Face(nose:new Nose()).save()
Relaciones one-to-many
class Author {
static hasMany = [books: Book]
String name
}
class Book {
//static belongsTo = [author: Author]
String title
}
-----------------------------------------------------
//En este ejemplo Grails genera una tabla intermedia. El comportamiento defecto es
ejecutar en cascada saves y updates, pero los delete sobre autores. Para ello se debe
descomentar la línea belongsTo en book.
Relaciones many-to-many
 En las relaciones many-to-
many se debe especificar
siempre el dueño de la
relación con belongsTo.
 La clase owner será quien
difunda en cascada los
cambios
 Sólo uno de los lados puede
ser dueño de la relación
class Book {
static belongsTo = Author
static hasMany = [authors:Author]
String title
}
class Author {
static hasMany = [books:Book]
String name
}
-------------------------------------
new Author(name:"Stephen King")
.addToBooks(new Book(title:"The Stand"))
.addToBooks(new Book(title:"The Shining"))
.save()
Relaciones embeded
 Permiten utilizar la noción de
composición en Grails.
 Sirve para agrupar campos que van
a ser utilizados por muchas clases
de dominio en una sola clase.
 Los atributos de la clase embebida
se guardan en columnas de la tabla
de la clase contenedora
class Person {
Address homeAddress
Address workAddress
static embedded = ['homeAddress',
'workAddress']
}
class Address {
String number
String code
}
Acceso y búsqueda de instancias
 Existen varios métodos para obtener las clases de dominio a través de GORM:
 Listando las instancias
 Obteniéndolas por id
 Dynamic Finders
 Where Queries
 Criteria Queries
 Hibernate Query Language (HQL)
Acceso y búsqueda de instancias
Listando las instancias
def books = Book.list()
//Permite paginación
def books = Book.list(offset:10, max:20)
//Permite búsquedas ordenadas por
//atributos
def books = Book.list(sort:"title",
order:"asc")
Obteniéndolas por id
def book = Book.get(23)
def books = Book.getAll(23, 93, 81)
Dynamic Finders
class Book {
String title
Date releaseDate
Author author
}
class Author {
String name
}
----------------------------------------------------
def book = Book.findByTitle("The Stand")
book = Book.findByTitleLike("Harry Pot%")
book = Book.findByReleaseDateBetween(firstDate, secondDate)
book = Book.findByReleaseDateGreaterThan(someDate)
book = Book.findByTitleLikeOrReleaseDateLessThan("%Something%",
someDate)
Criteria query
def c = Account.createCriteria()
def results = c {
between("balance", 500, 1000)
eq("branch", "London")
or {
like("holderFirstName", "Fred%")
like("holderFirstName", "Barney%")
}
maxResults(10)
order("holderLastName", "desc")
}
Atributos transient
class Author {
String name
String getUpperCaseName() {
name.toUpperCase()
}
static transients = ['upperCaseName']
}
---------------------------------------------------------
//Se utilizan para campos readonly que no se van a guardar en
//la base
Controladores
Características y definición
 Son las clases responsables de
manejar las llamadas Web
 Cumplen el rol de controlador en el
modelo MVC
 Por convención sus nombres
terminan siempre con el sufijo
controller
 Por convención los nombres de los
métodos mapean a una URL de
alguna vista.
class ProjectController {
static allowedMethods = [save: "POST", update:
"POST", delete: "POST"]
def index() {
redirect(action: "list", params: params)
}
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[projectInstanceList: Project.list(params),
projectInstanceTotal: Project.count()]
}
def create() {
[projectInstance: new Project(params)]
}
}

Más contenido relacionado

Destacado

Diapositivas Ejercicios Mate Final TFM
Diapositivas Ejercicios Mate Final TFMDiapositivas Ejercicios Mate Final TFM
Diapositivas Ejercicios Mate Final TFMCristofer Monserrat
 
El comienzo del final
El comienzo del finalEl comienzo del final
El comienzo del finalMica Ibañez
 
Confer 4 perfil epid pi
Confer 4 perfil epid piConfer 4 perfil epid pi
Confer 4 perfil epid pikenia16
 
Ruta Startup Perú 2015
Ruta Startup Perú 2015Ruta Startup Perú 2015
Ruta Startup Perú 2015Ruta Startup
 
La contaminacion ambiental
La contaminacion ambientalLa contaminacion ambiental
La contaminacion ambientalmayramoval
 
Higiene y seguridad industrial
Higiene y seguridad industrialHigiene y seguridad industrial
Higiene y seguridad industrialCamilo_665
 
-El comienzo del final-
-El comienzo del final--El comienzo del final-
-El comienzo del final-Mica Ibañez
 
Ensayo la carta Iberoamericana de gobierno electrónico
Ensayo la carta Iberoamericana de gobierno electrónicoEnsayo la carta Iberoamericana de gobierno electrónico
Ensayo la carta Iberoamericana de gobierno electrónicoAniseAldana
 
Castillo choque tutorial - obtener dispositivo de compromisou000du000d
Castillo choque tutorial - obtener dispositivo de compromisou000du000dCastillo choque tutorial - obtener dispositivo de compromisou000du000d
Castillo choque tutorial - obtener dispositivo de compromisou000du000dblackburnnapthvzghx
 
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...I.U.P "Santiago Mariño"
 
Teorías del aprendizaje y tics
Teorías del aprendizaje y ticsTeorías del aprendizaje y tics
Teorías del aprendizaje y ticscarlosaluzardo
 

Destacado (20)

Diapositivas Ejercicios Mate Final TFM
Diapositivas Ejercicios Mate Final TFMDiapositivas Ejercicios Mate Final TFM
Diapositivas Ejercicios Mate Final TFM
 
Cp
CpCp
Cp
 
Diapositivas astrid
Diapositivas astridDiapositivas astrid
Diapositivas astrid
 
5702403
57024035702403
5702403
 
El comienzo del final
El comienzo del finalEl comienzo del final
El comienzo del final
 
Confer 4 perfil epid pi
Confer 4 perfil epid piConfer 4 perfil epid pi
Confer 4 perfil epid pi
 
Slideshare.
Slideshare.Slideshare.
Slideshare.
 
Ruta Startup Perú 2015
Ruta Startup Perú 2015Ruta Startup Perú 2015
Ruta Startup Perú 2015
 
La contaminacion ambiental
La contaminacion ambientalLa contaminacion ambiental
La contaminacion ambiental
 
DOFA y PEEA TRECE 31
DOFA y PEEA TRECE 31DOFA y PEEA TRECE 31
DOFA y PEEA TRECE 31
 
Higiene y seguridad industrial
Higiene y seguridad industrialHigiene y seguridad industrial
Higiene y seguridad industrial
 
El futbo
El futboEl futbo
El futbo
 
Politicas de seguridad
Politicas de seguridadPoliticas de seguridad
Politicas de seguridad
 
-El comienzo del final-
-El comienzo del final--El comienzo del final-
-El comienzo del final-
 
Estanterías convencionales
Estanterías convencionalesEstanterías convencionales
Estanterías convencionales
 
Ensayo la carta Iberoamericana de gobierno electrónico
Ensayo la carta Iberoamericana de gobierno electrónicoEnsayo la carta Iberoamericana de gobierno electrónico
Ensayo la carta Iberoamericana de gobierno electrónico
 
Castillo choque tutorial - obtener dispositivo de compromisou000du000d
Castillo choque tutorial - obtener dispositivo de compromisou000du000dCastillo choque tutorial - obtener dispositivo de compromisou000du000d
Castillo choque tutorial - obtener dispositivo de compromisou000du000d
 
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...
Historia de la arquiectura II- Identificacion de los elementos del estilo Bar...
 
Teorías del aprendizaje y tics
Teorías del aprendizaje y ticsTeorías del aprendizaje y tics
Teorías del aprendizaje y tics
 
Act1_HLCB
Act1_HLCBAct1_HLCB
Act1_HLCB
 

Más de chelen2002

Studio Automation
Studio AutomationStudio Automation
Studio Automationchelen2002
 
Scrum vs Pmi Class2
Scrum vs Pmi Class2Scrum vs Pmi Class2
Scrum vs Pmi Class2chelen2002
 
Scrum vs Pmi Class1
Scrum vs Pmi Class1Scrum vs Pmi Class1
Scrum vs Pmi Class1chelen2002
 
Presentacion Pro Techo
Presentacion Pro TechoPresentacion Pro Techo
Presentacion Pro Techochelen2002
 
Grails presentation3
Grails presentation3Grails presentation3
Grails presentation3chelen2002
 
Grails presentation1
Grails presentation1Grails presentation1
Grails presentation1chelen2002
 
Sistemas y analisis de Fallas
Sistemas y analisis de FallasSistemas y analisis de Fallas
Sistemas y analisis de Fallaschelen2002
 
Structure presentation
Structure presentationStructure presentation
Structure presentationchelen2002
 

Más de chelen2002 (8)

Studio Automation
Studio AutomationStudio Automation
Studio Automation
 
Scrum vs Pmi Class2
Scrum vs Pmi Class2Scrum vs Pmi Class2
Scrum vs Pmi Class2
 
Scrum vs Pmi Class1
Scrum vs Pmi Class1Scrum vs Pmi Class1
Scrum vs Pmi Class1
 
Presentacion Pro Techo
Presentacion Pro TechoPresentacion Pro Techo
Presentacion Pro Techo
 
Grails presentation3
Grails presentation3Grails presentation3
Grails presentation3
 
Grails presentation1
Grails presentation1Grails presentation1
Grails presentation1
 
Sistemas y analisis de Fallas
Sistemas y analisis de FallasSistemas y analisis de Fallas
Sistemas y analisis de Fallas
 
Structure presentation
Structure presentationStructure presentation
Structure presentation
 

Último

PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 

Último (7)

PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 

Grails presentation2

  • 3. Definición y características class Student { String name String lastname String mail static belongsTo = [university : University] static constraints = { name blank: false lastname blank:false mail unique: true, email: true } } • Métodos públicos por defecto • Atributos privados por defecto • Getters y Setters invocados sin estar explicitos • Mapeos contra la base de datos • Relaciones con otras clases de dominio • Constraints sobre atributos • Constructor por defecto con parámetro Map • Métodos dinámicos para búsquedas
  • 4. Constraints  Son configuraciones escritas en un DSL para Grails que permiten realizar validaciones sobre las clases de dominio  Algunas de las más utilizadas: • blank • email • inList • max/min • size/maxSize/minSize • range • unique
  • 5. Mapeo entre clases de Dominio • Permiten establecer relaciones bidireccionales • Especifican el comportamiento del ORM al guardar o borrar instancias de clases de dominio • Permite a Grails generar las tablas intermedias para las relaciones • Las instancias que son referenciadas en el hasMany se almacenan por default en la clase Set de Java.
  • 6. Relaciones one-to-one class Face { Nose nose } class Nose { static belongsTo = [face : Face] } -------------------------------------------------- //Las llamdas a save o delete en Face van a aplicarse en cascada sobre Nose new Face(nose:new Nose()).save()
  • 7. Relaciones one-to-many class Author { static hasMany = [books: Book] String name } class Book { //static belongsTo = [author: Author] String title } ----------------------------------------------------- //En este ejemplo Grails genera una tabla intermedia. El comportamiento defecto es ejecutar en cascada saves y updates, pero los delete sobre autores. Para ello se debe descomentar la línea belongsTo en book.
  • 8. Relaciones many-to-many  En las relaciones many-to- many se debe especificar siempre el dueño de la relación con belongsTo.  La clase owner será quien difunda en cascada los cambios  Sólo uno de los lados puede ser dueño de la relación class Book { static belongsTo = Author static hasMany = [authors:Author] String title } class Author { static hasMany = [books:Book] String name } ------------------------------------- new Author(name:"Stephen King") .addToBooks(new Book(title:"The Stand")) .addToBooks(new Book(title:"The Shining")) .save()
  • 9. Relaciones embeded  Permiten utilizar la noción de composición en Grails.  Sirve para agrupar campos que van a ser utilizados por muchas clases de dominio en una sola clase.  Los atributos de la clase embebida se guardan en columnas de la tabla de la clase contenedora class Person { Address homeAddress Address workAddress static embedded = ['homeAddress', 'workAddress'] } class Address { String number String code }
  • 10. Acceso y búsqueda de instancias  Existen varios métodos para obtener las clases de dominio a través de GORM:  Listando las instancias  Obteniéndolas por id  Dynamic Finders  Where Queries  Criteria Queries  Hibernate Query Language (HQL)
  • 11. Acceso y búsqueda de instancias Listando las instancias def books = Book.list() //Permite paginación def books = Book.list(offset:10, max:20) //Permite búsquedas ordenadas por //atributos def books = Book.list(sort:"title", order:"asc") Obteniéndolas por id def book = Book.get(23) def books = Book.getAll(23, 93, 81)
  • 12. Dynamic Finders class Book { String title Date releaseDate Author author } class Author { String name } ---------------------------------------------------- def book = Book.findByTitle("The Stand") book = Book.findByTitleLike("Harry Pot%") book = Book.findByReleaseDateBetween(firstDate, secondDate) book = Book.findByReleaseDateGreaterThan(someDate) book = Book.findByTitleLikeOrReleaseDateLessThan("%Something%", someDate)
  • 13. Criteria query def c = Account.createCriteria() def results = c { between("balance", 500, 1000) eq("branch", "London") or { like("holderFirstName", "Fred%") like("holderFirstName", "Barney%") } maxResults(10) order("holderLastName", "desc") }
  • 14. Atributos transient class Author { String name String getUpperCaseName() { name.toUpperCase() } static transients = ['upperCaseName'] } --------------------------------------------------------- //Se utilizan para campos readonly que no se van a guardar en //la base
  • 16. Características y definición  Son las clases responsables de manejar las llamadas Web  Cumplen el rol de controlador en el modelo MVC  Por convención sus nombres terminan siempre con el sufijo controller  Por convención los nombres de los métodos mapean a una URL de alguna vista. class ProjectController { static allowedMethods = [save: "POST", update: "POST", delete: "POST"] def index() { redirect(action: "list", params: params) } def list(Integer max) { params.max = Math.min(max ?: 10, 100) [projectInstanceList: Project.list(params), projectInstanceTotal: Project.count()] } def create() { [projectInstance: new Project(params)] } }