(Quick Reference)

17 GrailsとHibernate - Reference Documentation

Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith

Version: 2.4.0.M1

Translated by: T.Yamamoto, Japanese Grails Doc Translating Team. Special thanks to NTT Software.
【注意】このドキュメントの内容はスナップショットバージョンを元に*意訳*されているため、一部現行バージョンでは未対応の機能もあります。

17 Grailsと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!
もしGORM(Grailsオブジェクトリレーショナルマッピング)に好みの設定をする十分な柔軟性がない場合は、XMLマッピングファイル、またはJPAアノテーションを使用して、ドメインクラスに対するHibernateのマッピングができます。 これにより、レガシーシステムといった広い範囲でドメインクラスのマッピングが可能になり、 また柔軟なデータベースのスキーマ作成が可能にもなります。 そして、このXMLマッピングファイル、JPAアノテーションを使用した場合も、GORMが提供するダイナミックな永続化メソッド、クエリメソッドをすべて呼び出せます!

17.1 Hibernate XMLマッピングの使用

Mapping your domain classes with XML is pretty straightforward. Simply create a hibernate.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を使用したドメインクラスのマッピングは非常に簡単です。 手動、またはcreate-hibernate-cfg-xmlコマンドを使用して、単にgrails-app/conf/hibernateディレクトリにhibernate.cfg.xmlファイルを作成します。 ファイルの内容は以下のようになります。

<?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>

The individual mapping files, like 'org.example.Book.hbm.xml' in the above example, also go into the grails-app/conf/hibernate directory. To find out how to map domain classes with XML, check out the Hibernate manual.
上記の例のように'org.example.Book.hbm.xml'といった個々のマッピングファイルも、grails-app/conf/hibernateディレクトリに格納します。 XMLを使用して、どうのようにドメインクラスをマッピングするかはHibernateのマニュアルを確認してください。

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.cfg.xmlファイルのデフォルトの格納場所を変更したい場合は、grails-app/conf/DataSource.groovyに別の場所を指定することで変更できます。

hibernate {
    config.location = "file:/path/to/my/hibernate.cfg.xml"
}

or even a list of locations:
または、場所の一覧を指定します。

hibernate {
    config.location = ["file:/path/to/one/hibernate.cfg.xml",
                       "file:/path/to/two/hibernate.cfg.xml"]
}

Grails also lets you write your domain model in Java or reuse an existing one that already has Hibernate mapping files. Simply place the mapping files into 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!
GrailsではJavaでドメインモデルを書くことも、すでにHibernateのマッピングファイルを持っている既存のJavaクラスをそのまま流用することもできます。 マッピングファイルは単にgrails-app/conf/hibernateに格納し、Javaファイルはsrc/javaに格納するか、ドメインモデルがJARファイルでパッケージングされている場合は、libディレクトリにそのクラスのJARファイルを格納します。 その場合でもhibernate.cfg.xmlは必要です。

17.2 Hibernateアノテーションでのマッピング

To map a domain class with annotations, create a new class in src/java and use the annotations defined as part of the EJB 3.0 spec (for more info on this see the Hibernate Annotations Docs):
アノテーションを使用してドメインクラスをマッピングするには、src/javaに新たなクラスを作成し、EJB 3.0の仕様として定義されているアノテーションを使用します(より詳細な情報はHibernateのアノテーションに関するドキュメントを参照してください)。

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; } }

Then register the class with the Hibernate sessionFactory by adding relevant entries to the grails-app/conf/hibernate/hibernate.cfg.xml file as follows:
次に、grails-app/conf/hibernate/hibernate.cfg.xmlファイルに関連エントリを以下のように追加することで、HibernateのsessionFactoryにクラスを登録します。

<!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>
See the previous section for more information on the hibernate.cfg.xml file.
hibernate.cfg.xmlファイルの詳細は、前のセクションを参照してください。

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.
先程のドメインクラスをGrailsがロードするときに、クラスに対し必要なダイナミックメソッドを追加します。 ダイナミックメソッド以外に、Hibernateのドメインクラスで何ができるかについては、スカッフォルディングのセクションを参照してください。

17.3 制約の追加

You can still use GORM validation even if you use a Java domain model. Grails lets you define constraints through separate scripts in the src/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.
Javaのドメインモデルを使用する場合でも、GORMのバリデーションを使用できます。 Grailsではsrc/javaディレクトリ内の、別個のスクリプトを通じて制約を定義します。 このスクリプトは、対応するドメインクラスのパッケージと同じディレクトリ内に格納し、ファイル名のサフィックスは Constraints でなければなりません。 たとえば、org.example.Bookというドメインクラスの場合は、src/java/org/example/BookConstraints.groovyというスクリプトを作成します。

Add a standard GORM constraints block to the script:
そして、このスクリプトに通常のGORMのconstraintsブロックを追加してください。

constraints = {
    title blank: false
    author blank: false
}

Once this is in place you can validate instances of your domain class!
正しく設定できていれば、ドメインクラスのインスタンスに対してバリデーションが可能になります。