lunes, 21 de mayo de 2012

Grails - Conexión a una base de datos

Si bien es cierto Grails nos provee de una base de datos, esta es sumamente básica, por lo que generalmente trabajaremos con una base de datos diferente, por ejemplo PostgreSQL, MySQL, Oracle, etc.

Por suerte, gracias a lo que nos ofrece, hacer esto en Grails, no es para nada complicado. En primero lugar creamos la aplicación y luego creamos una base de datos, en este caso lo haremos en Mysql:
$ grails create-apps nombre_aplicacion
$ mysql -u root -p
//Ingresar contraseña
create database testgrailsdb
quit
O también podemos hacerlo un poco más fácil si es que utilizamos un administrador como PhpMyAdmin.

Ahora debemos descargarnos el conector que hará la conexión con la base de datos, en este ejemplo utilizaré MySQL, para esto vamos a http://dev.mysql.com/downloads/connector/j/ y lo dejamos en el directorio lib, si estas en Netbeans lo dejas en Libraries.

Luego creamos un dominio, le creamos atributos y generamos el control y la vista para este. Para hacer esto debemos estar dentro del directorio de nuestra aplicación.
$ grails create-domain-class Persona
$ nano grails-app/domain/
//Agregamos los campos que deseemos, por ejemplo
class Personas {
    String nombre
    String apellido
 
static constraints = {
    }
}
//Ahora generamos el controlador y la vista para esto
grails generate-all Personas
Una vez terminado todo esto debemos ir al fichero DataSource.groovy.
grails-app/conf/DataSource.groovy
O si es como en mi caso, que utilizan Netbeans como IDE de desarrollo, deben ir a:
Configuration/DataSource.groovy
Una vez dentro de este fichero, encontraremos varias líneas de código, parecido a esto:
dataSource {
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:mem:devDb;MVCC=TRUE"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:prodDb;MVCC=TRUE"
            pooled = true
            properties {
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
            }
        }
    }
}
El cual debemos modificarlo y dejar algo parecido a esto:
dataSource {
    pooled = true
    driverClassName = 'com.mysql.jdbc.Driver'
    dbCreate = 'update'
    username = "nombreusuario"
    password = "contraseña"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            url = "jdbc:mysql://localhost:3306/nombredb" // one of 'create', 'create-drop', 'update', 'validate', ''
            username = "nombreusuario"
            password = "contraseña"
        }
    }
    test {
        dataSource {
            url = "jdbc:mysql://localhost:3306/nombredb" // one of 'create', 'create-drop', 'update', 'validate', ''
            username = "nombreusuario"
            password = "contraseña"
        }
    }
    production {
        dataSource {
            url = "jdbc:mysql://localhost:3306/nombredb" // one of 'create', 'create-drop', 'update', 'validate', ''
            username = "nombreusuario"
            password = "contraseña"
            }
        }
    }
}
Este ejemplo mostramos como conectarnos a MySQL, pero la base es muy similar para otros motores de base de datos.


Como dato, dentro de las clases encontramos “Static constraints” dentro de este tenemos harto para jugar, por ejemplo hacer que sea “not null” “unique”, entre otros, ejemplo básico de esto es:
class Personas {
    String nombre
    String apellido
   
    static constraints = {
nombre(unique: true, blank: false)
apellido(blank:false)
    }
}

1 comentarios:

Error 2013-01-10 21:12:16,513 [localhost-startStop-1] ERROR context.GrailsContextLoader - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'

Publicar un comentario