Fullmenu null

 

30 March 2018

Note
GORM (Groovy o Grails?) Object Relational Mapping, http://gorm.grails.org/, is the library from Grails who allow us to access and manage our database. At the beginning it only worked with Hibernate but recently it works with Neo4J, NoSQL as MongoDB, etc

In this example we’ll write a simple Groovy Script showing how to do a Library with some functionalities from GORM

Dependencies

@GrabConfig(systemClassLoader=true)
@Grab('org.slf4j:slf4j-api:1.7.10')
@Grab('org.xerial:sqlite-jdbc:3.21.0')
@Grab('org.grails:grails-datastore-gorm-hibernate5:6.1.6.RELEASE')
@Grab('com.enigmabridge:hibernate4-sqlite-dialect:0.1.2')

import groovy.sql.Sql
import groovy.transform.ToString
import org.grails.orm.hibernate.HibernateDatastore
import grails.gorm.annotation.Entity

Domain

Our domain will be a Library (Biblioteca in spanish) and Books (Libro in spanish) where the first contains a relationship with the second

diag 5c86b65cef2eadb010a6f329a3e42997

We declare two @Entity classes with the desired attributes and relationships

@Entity
@ToString
class Libro {
    String codigo
    String titulo
    static constraints = {
        codigo unique:true
    }
}

@Entity
@ToString
class Biblioteca{
    String nombre
    static hasMany = [ libros : Libro]
}

GORM will find classes using @Entity annotation and wrap them with a lot of functions. In this scritp we’ll not use some of them as validator and so on

Configuration

We need to configure Hibernate in order to use a SQLite:

Map getConfiguration(){
    [
            'dataSource.url'			:'jdbc:sqlite:example.db',
            'dataSource.drive'			:'org.sqlite.JDBC',
            'hibernate.hbm2ddl.auto'	: 'update',
            'hibernate.dialect'			:'com.enigmabridge.hibernate.dialect.SQLiteDialect'
    ]
}

HibernateDatastore initDatastore(){
    new HibernateDatastore( configuration, Biblioteca, Libro)
}

We configure the url, the dialect and what classes we want to use with Hibernate (all @Entity classes)

New Library

void prepareBiblioteca() {
    Biblioteca.withTransaction {

        Biblioteca.list().each{ it.delete() }

        new Biblioteca(nombre: 'Biblioteca Nacional').save()
    }
}

New Book

void addLibros(){
    Biblioteca.withTransaction{
        Biblioteca b = Biblioteca.first()
        assert b

        b.addToLibros(codigo:'abc', titulo: 'libro 1')

        b.save()
    }
}

Querying our Library

void list(){
    Biblioteca.withTransaction{
        assert Biblioteca.count()   //(1)

        def list = Biblioteca.list()    //(2)
        list.each{ Biblioteca b->
            println "Biblioteca $b.nombre ($b.id): "
            b.libros.each{ Libro l->    //(3)
                println "\t $l.codigo con titulo $l.titulo"
            }

        }
    }

    Biblioteca.withNewSession{
        Biblioteca b = Biblioteca.findByNombre('Biblioteca Nacional')   //(4)
        assert b
        println "Biblioteca encontrada $b"

        List list = Biblioteca.findAllByNombreLike('Bibli%')    //(5)
        assert list.size()

        List list2 = Biblioteca.withCriteria{   //(6)
            eq 'nombre', 'Biblioteca Nacional'
        }
        assert list2.size()
    }
}
  1. select count(*) from biblioteca

  2. select * from biblioteca

  3. select * from libros where biblioteca_id = ?

  4. findByXXX

  5. findAll

  6. withCriteria

Test

initDatastore()

prepareBiblioteca()

addLibros()

println '-'.multiply(20)

list()
println '-'.multiply(20)

Script
//tag::dependencias[]
@GrabConfig(systemClassLoader=true)
@Grab('org.slf4j:slf4j-api:1.7.10')
@Grab('org.xerial:sqlite-jdbc:3.21.0')
@Grab('org.grails:grails-datastore-gorm-hibernate5:6.1.6.RELEASE')
@Grab('com.enigmabridge:hibernate4-sqlite-dialect:0.1.2')

import groovy.sql.Sql
import groovy.transform.ToString
import org.grails.orm.hibernate.HibernateDatastore
import grails.gorm.annotation.Entity
//end::dependencias[]

//tag::domain[]
@Entity
@ToString
class Libro {
    String codigo
    String titulo
    static constraints = {
        codigo unique:true
    }
}

@Entity
@ToString
class Biblioteca{
    String nombre
    static hasMany = [ libros : Libro]
}
//end::domain[]

//tag::config[]
Map getConfiguration(){
    [
            'dataSource.url'			:'jdbc:sqlite:example.db',
            'dataSource.drive'			:'org.sqlite.JDBC',
            'hibernate.hbm2ddl.auto'	: 'update',
            'hibernate.dialect'			:'com.enigmabridge.hibernate.dialect.SQLiteDialect'
    ]
}

HibernateDatastore initDatastore(){
    new HibernateDatastore( configuration, Biblioteca, Libro)
}
//end::config[]

//tag::biblio[]
void prepareBiblioteca() {
    Biblioteca.withTransaction {

        Biblioteca.list().each{ it.delete() }

        new Biblioteca(nombre: 'Biblioteca Nacional').save()
    }
}
//end::biblio[]

//tag::libros[]
void addLibros(){
    Biblioteca.withTransaction{
        Biblioteca b = Biblioteca.first()
        assert b

        b.addToLibros(codigo:'abc', titulo: 'libro 1')

        b.save()
    }
}
//end::libros[]

//tag::list[]
void list(){
    Biblioteca.withTransaction{
        assert Biblioteca.count()   //(1)

        def list = Biblioteca.list()    //(2)
        list.each{ Biblioteca b->
            println "Biblioteca $b.nombre ($b.id): "
            b.libros.each{ Libro l->    //(3)
                println "\t $l.codigo con titulo $l.titulo"
            }

        }
    }

    Biblioteca.withNewSession{
        Biblioteca b = Biblioteca.findByNombre('Biblioteca Nacional')   //(4)
        assert b
        println "Biblioteca encontrada $b"

        List list = Biblioteca.findAllByNombreLike('Bibli%')    //(5)
        assert list.size()

        List list2 = Biblioteca.withCriteria{   //(6)
            eq 'nombre', 'Biblioteca Nacional'
        }
        assert list2.size()
    }
}
//end::list[]

//tag::main[]
initDatastore()

prepareBiblioteca()

addLibros()

println '-'.multiply(20)

list()
println '-'.multiply(20)
//end::main[]