19 Grails and Hibernate - Reference Documentation
Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith, Lari Hotari
Version: 2.5.0
Table of Contents
19 Grails and Hibernate
If GORM (Grails Object Relational Mapping) is not flexible enough for your liking you can alternatively map your domain classes using Hibernate, either with XML mapping files or JPA annotations. You will be able to map Grails domain classes onto a wider range of legacy systems and have more flexibility in the creation of your database schema. Best of all, you will still be able to call all of the dynamic persistent and query methods provided by GORM!19.1 Using Hibernate XML Mapping Files
Mapping your domain classes with XML is pretty straightforward. Simply create ahibernate.cfg.xml
file in your project's grails-app/conf/hibernate
directory, either manually or with the create-hibernate-cfg-xml command, that contains the following:<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Example mapping file inclusion --> <mapping resource="org.example.Book.hbm.xml"/> … </session-factory> </hibernate-configuration>
grails-app/conf/hibernate
directory. To find out how to map domain classes with XML, check out the Hibernate manual.If the default location of the hibernate.cfg.xml
file doesn't suit you, you can change it by specifying an alternative location in grails-app/conf/DataSource.groovy
:hibernate {
config.location = "file:/path/to/my/hibernate.cfg.xml"
}
hibernate { config.location = ["file:/path/to/one/hibernate.cfg.xml", "file:/path/to/two/hibernate.cfg.xml"] }
grails-app/conf/hibernate
and either put the Java files in src/java
or the classes in the project's lib
directory if the domain model is packaged as a JAR. You still need the hibernate.cfg.xml
though!
19.2 Mapping with Hibernate Annotations
To map a domain class with annotations, create a new class insrc/java
and use the annotations defined as part of the EJB 3.0 spec (for more info on this see the Hibernate Annotations Docs):package com.books;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;@Entity public class Book { private Long id; private String title; private String description; private Date date; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
sessionFactory
by adding relevant entries to the grails-app/conf/hibernate/hibernate.cfg.xml
file as follows:<!DOCTYPE hibernate-configuration SYSTEM "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <mapping package="com.books" /> <mapping class="com.books.Book" /> </session-factory> </hibernate-configuration>
hibernate.cfg.xml
file.When Grails loads it will register the necessary dynamic methods with the class. To see what else you can do with a Hibernate domain class see the section on Scaffolding.
19.3 Adding Constraints
You can still use GORM validation even if you use a Java domain model. Grails lets you define constraints through separate scripts in thesrc/java
directory. The script must be in a directory that matches the package of the corresponding domain class and its name must have a Constraints suffix. For example, if you had a domain class org.example.Book
, then you would create the script src/java/org/example/BookConstraints.groovy
.Add a standard GORM constraints
block to the script:
constraints = { title blank: false author blank: false }