anchor.diff:  *** **unique** -> Verifica que un valor o grupo de valores no se repita
   *** **validator** -> Permite la creación de una validación personalizada
   
  +== GRAILS / GORM
  +
  +* Práctica 3-B
  +** Aplicar la mayor parte de los constraints al modelo de dominio
  +** 15 minutos
  +
   == Grails / GORM
   
   * Relaciones
   ** Uno a uno
  -
  -
  -** Constraints
  +*** Se aplica cuando una clase es propiedad de otra:
  +[source,groovy]
  +----
  +class Hotel{
  +	String nombre
  +	Recepcion recepcion
  +}
  +class Recepcion{
  +	String ubicacion
  +	Hotel hotel
  +}
  +----
  +*** Se recomienda que una clase sea la que domine a la otra mediante el atributo **belongsTo**
  +[source,groovy]
  +----
  +class Hotel{
  +	String nombre
  +	Recepcion recepcion
  +}
  +class Recepcion{
  +	String ubicacion
  +	static belongsTo = [hotel:Hotel]
  +}
  +----
  +
  +== Grails / GORM
  +
  +* Relaciones
  +** Uno a muchos
  +*** Se recomienda utilizar el atributo **hasMany**
  +*** Se recomienda que la clase derivada también tenga un atributo **belongsTo**
  +[source,groovy]
  +----
  +class Hotel{
  +	String nombre
  +	Recepcion recepcion
  +	static hasMany = [habitaciones:Habitacion]
  +}
  +class Habitacion{
  +	int piso
  +	int numero
  +	static belongsTo = [hotel:Hotel]
  +}
  +----
  +
  +== Grails / GORM
  +
  +* Relaciones
  +** Muchos a muchos
  +*** Ambas clases tendrán el atributo **hasMany**
  +*** Una deberá llevar el atributo **belongsTo** (Puede indicar solo la clase)
  +[source,groovy]
  +----
  +class Hotel{
  +	String nombre
  +	Recepcion recepcion
  +	static hasMany = [habitaciones:Habitacion,huespedes.Huesped]
  +}
  +class Huesped{
  +	String nombre
  +	static hasMany = [hoteles:Hotel]
  +	static belongsTo = Hotel
  +}
  +----
  +
  +== GRAILS / GORM
  +
  +* Práctica 3-C
  +** Relacionar el modelo de dominio entre sí
  +** 15 minutos
  +
  +
  +
   ** Criteria queries
   
   * Grails (Cont.)
  
positive.code:                                                   
            +------------------+------------------+
            |                                     |
            |      		  FRONTEND              |
            |			    Controllers             |
            |         Command / ModelAndView      |
            |					GSP                 |
            |                                     |
            +-------------------------------------+                                                  
            |                                     |
            |               SERVICES              |
            |			    Spring Beans            |
            |			 Transaccionalidad          |
            |                                     |
            +-------------------------------------+
            |                                     |
            |            DOMAIN LAYER             |
            |				   GORM	                |
            |				 Hibernate              |
            |                                     |
            +-------------------------------------+          					 
  							 |
  							 v
            +------------------+------------------+
            |                                     |
            |                RDBMS                |
  
negative.code: ** Plantear el modelo de dominio para una aplicación de facturación
  ** Cada quien una clase
  ** 15 minutos
  ** Probar el almacenado en Base de datos
  [source,groovy]
  ----
  objeto.save()
  ----
  ** Mostrar el listado de objetos almacenados:
  [source,groovy]
  ----
  Clase.list()
  ----
  ** Obtener un objeto por su Id:
  [source,groovy]
  ----
  Clase.get(<id>)
  ----
  
  == GRAILS / GORM
  
  