Está en la página 1de 6

Object relational mapping Para probar nuestras clases de dominio se puede utilizar la consola de grails, se ejecuta com el comando

de grails console, es una consola de groovy con extensiones para grails. Para acceder a las clases de dominio primero importar el package donde se encuentran, luego se pueden utilizar dentro del script: crear una clase de dominio: grails create-domain-class helloworld.Person class Person { String name Integer age Date lastVisit }

ABM Bsico: Guardar una persona nueva en la base de datos: def p = new Person(name: "Fred", age: 40, lastVisit: new Date()) p.save() Leer de la base de datos por id: def p = Person.get(1) assert 1 == p.id //en modo solo lectura def p = Person.read(1) Modificar: def p = Person.get(1) p.name = "Bob" p.save() Borrar: def p = Person.get(1) p.delete()

Para probar nuestras clases de dominio se puede utilizar la consola de grails, se ejecuta com el comando de grails console, es una consola de groovy con extensiones para grails. Para acceder a las clases de dominio primero importar el package donde se encuentran, luego se pueden utilizar dentro del script. Asociaciones en gorm: Asociacin simple: class Face { Nose nose } class Nose { }

Para hacer la relacion bidireccional: class Face { Nose nose } class Nose { static belongsTo = [face:Face] } la propiedad esttica belongsTo declara en la base el borrado en cascada, si se borra un objeto Face tambin se borra su objeto Nose asociado. Relacin uno a uno: class Face { static hasOne = [nose:Nose] static constraints = { nose unique: true } } class Nose { Face face }

Relacin uno a muchos:

class Author { static hasMany = [books: Book] String name } class Book { String title } Relacin uno a muchos bidireccional (borrado en cascada): class Author { static hasMany = [books: Book] String name } class Book { static belongsTo = [author: Author] String title }

def a = Author.get(1) for (book in a.books) { println book.title } Uno a muchos con mas de una asociacin: class Airport { static hasMany = [flights: Flight] // se utiliza mappedBy para especificar que coleccin mapeada static mappedBy = [flights: "departureAirport"] } class Flight { Airport departureAirport Airport destinationAirport }

es

la

//si hay mltiples colecciones class Airport { static hasMany = [outboundFlights: Flight, inboundFlights: Flight] static mappedBy = [outboundFlights: "departureAirport", inboundFlights: "destinationAirport"]

} class Flight { Airport departureAirport Airport destinationAirport } Relacin muchos a muchos: class Book { static belongsTo = Author static hasMany = [authors:Author] String title } class Author { static hasMany = [books:Book] String name } Composicin: class Person { Address homeAddress Address workAddress static embedded = ['homeAddress', 'workAddress'] } /Address se define en el mismo archivo que Person class Address { String number String code }

Herencia: class Content { String author } class BlogEntry extends Content { URL url } class Book extends Content { String ISBN }

class PodCast extends Content { byte[] audioStream } Query polimorfico: def content = Content.list() // list all blog entries, books and podcasts content = Content.findAllByAuthor('Joe Bloggs') // find all by author def podCasts = PodCast.list() // list only podcasts Utilizando un conjunto ordenado en la relacin hasMany:

class Author { //se declara la propiedad con el tipo de coleccin ordenada. SortedSet books static hasMany = [books: Book] }

//la clase book debe implementar la interface comparable como esta definido en el api java.util.SortedSet class Book implements Comparable { String title Date releaseDate = new Date() int compareTo(obj) { releaseDate.compareTo(obj.releaseDate) } } Dinamic 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) Expresiones metodo: InList En la lista de valores dados LessThan Menor que un valor dado LessThanEquals menor que o igual que un valor dado GreaterThan mayor que un valor dado GreaterThanEquals mayor que o igual a un valor dado Like Equivalente a una expresin like SQL Ilike - Similar a Like, excepto case insensitive NotEqual Niega igualdad Between Entre 2 valores (requiere 2 argumentos) IsNotNull - No es un valor null (no toma un argumento) IsNull Es un valor null (no toma un argumento)