GORM pour Hibernate dans un script Groovy

GORM (Grails Object Relational Mapping) est une librairie d'accès aux données utilisée par le framework web Grails et qui, dès sa première version, s'est appuyée sur Hibernate pour faciliter le mapping entre le modèle objet et le modèle relationnel d'une application.
Aujourd'hui, GORM se décline en plusieurs implémentations pour MongoDB, Cassadra et Neo4j.

Mais on peut également tirer profit de GORM en dehors de Grails, par exemple dans une application riche ou un script Groovy.

A titre d'exemple, voici un exemple simple de script Groovy qui utilise GORM for Hibernate, et tire les librairies dépendantes grâce au système Grape. L'intérêt est ici de fournir un exemple de script complet que l'on peut exécuter grâce à Groovy, et dont les dépendances seront téléchargées automatiquement.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// See http://gorm.grails.org/latest/hibernate/manual/#outsideGrails

@Grab('org.grails:grails-datastore-gorm-hibernate5:6.1.6.RELEASE')
@Grab('com.h2database:h2:1.4.196')

// Add the dependency below if you want to use in-memory H2
// see http://gorm.grails.org/latest/hibernate/manual/#outsideGrails
@Grab('org.apache.tomcat:tomcat-jdbc:8.5.0')

import org.grails.orm.hibernate.HibernateDatastore
import grails.gorm.annotation.Entity


Map configuration = [
    'hibernate.hbm2ddl.auto':'create-drop',
    'dataSource.url':'jdbc:h2:mem:myDB'
]
def datastore = new HibernateDatastore(configuration, Person)

Person.withNewSession {
    new Person(name: 'odelia').save(flush: true)
    println "Total people = " + Person.count()
}

datastore.close()


@Entity
class Person {
    String name
    static constraints = {
        name blank: false
    }
}

Que fait ce script ?
Utilisant un objet HibernateDatastore pour l'accès aux données, il crée simplement un objet métier dont le type Person est annoté avec @grails.gorm.annotation.Entity, puis le persiste dans une base de données H2 en mémoire, au moyen de la méthode save() injectée par GORM. Ensuile, il affiche le nombre total d'entités Person en base de données, grâce à la méthode static Personn.count(), elle aussi injectée par GORM.
De plus, en coulisses, et en tenant compte de la valeur du paramètre de configuration hibernate.hbm2ddl.auto passé au datastore, GORM se charge de générer le schéma de la base de données (par convention on y trouvera une table PERSON).

Il est bien sûr possible d'utiliser une base de données H2 en fichier, ou bien un autre type de base de données, comme PosgreSQL par exemple, à condition de spécifier la bonne dépendance, et de modifier la valeur de paramètre dataSource.url de manière appropriée.

Vous voici maintenant prêts à expérimenter GORM beaucoup plus en profondeur, avec des scripts Groovy !