Hibernate 101(超クイックガイド)

前置き

Hibernateは、JavaのO/Rマッピングツールです。「開発者ノートシリーズ Hibernate(ジェイムス・エリオット、オライリー・ジャパン)」を教科書にして勉強してみました。つまずいた箇所を中心に要点をメモっておきます。

この教科書では、ジュークボックスアプリを作る過程を通してHibernateのイロハを体験できます。

本文

環境

  • Gentoo Linux
  • Hibernate-3.1.3
  • HibernateTools-3.3.1
  • ant-1.8.1
  • log4j-1.2.16
  • ehcache-1.1
  • postgresql-8.1.11
  • postgresql-8.1-415.jdbc2.jar

Hibernateをemergeすると、log4jやehcacheも入ると思います。HibernateToolsはPortageに入ってないので、Hibernateの公式ページからDLします。Eclipse用のプラグインとして提供されているので、その中のjarファイルを使いました。

登場人物

ディレクトリ構成は一例に過ぎません。Trackは「曲」という意味です(ジュークボックスアプリなので)。

登場人物

conf/の下に設定ファイルを置いていますが、ビルド時は、これらをclasspathのトップ(つまりclasses/)にコピーします。

教科書は、ちと古い

教科書ではHibernate2.Xを使っており、Hibernate3.Xでは教科書の通りにはいきません。

  • Hibernateのパッケージは、net.sf.hibernateではなく、org.hibernate
  • マッピングファイルのDTDは3.0を使う(後述)
  • Session#find()はdeprecatedなので、createQuery()やgetNamedQuery()を使う
  • スキーマからマッピングファイルを生成するには、MiddlegenではなくHibernateToolsを使う(後述)

準備

log4jとehcacheは必須ではありませんが、warningが出てうるさいので設定しておきます。

log4j

  • log4j.properties
#stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

#file
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.rootLogger=warn, stdout
log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate.SQL=debug
#log4j.logger.org.hibernate.type=debug
#log4j.logger.org.hibernate.tool.hbm2ddl=debug
#log4j.logger.org.hibernate.cache=debug
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

ehcache

  • ehcache.xml(★コメント入り)
<ehcache>
   <diskStore path="java.io.tmpdir"/>     ★/tmpにキャッシュファイルを作る。
   <defaultCache
       maxElementsInMemory="10000"
       eternal="false"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="true"
       />
   <cache name="MyAppCache"               ★ファイル名に使われるっぽい。
       maxElementsInMemory="10000"
       eternal="false"
       timeToIdleSeconds="300"
       timeToLiveSeconds="600"
       overflowToDisk="true"
       />
 </ehcache>

マッピングファイル

  • Track.hbm.xml(★コメント入り)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping             ★Hibernate3.X用のDOCTYPE宣言。
  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="com.oreilly.hh.Track" table="TRACK">
    <meta attribute="class-description">
      Represents each track.
    </meta>

    <cache usage="read-only" />         ★キャッシュehcacheを使う(省略可。書くならmetaの後に)。

    <id name="id" type="int" column="id">
      <meta attribute="scope-set">protected</meta>
      <generator class="native">
        <param name="sequence">track_id_seq</param>
                    ★sequence名を指定(Postgres特有?)。デフォルトはhibernate_sequence。
      </generator>
    </id>

    <property name="title" type="string" not-null="true"/>
    <property name="filePath" type="string" not-null="true"/>
    <property name="playTime" type="time" />
    <property name="added" type="date" />
    <property name="volume" type="short" />
  </class>

  <query name="com.oreilly.hh.tracksNoLongerThan">   ★クエリ。
    <![CDATA[
      from com.oreilly.hh.Track as track
      where track.playTime <= :length
    ]]>
  </query>

</hibernate-mapping>

HibernateToolsのAnt用タスク

  • build.xml(★コメント入り)
<taskdef name="hbmtool"
  classname="org.hibernate.tool.ant.HibernateToolTask"
  classpathref="project.class.path" />  ★project.class.pathは、別途<path>で定義。

hbm2java ~ マッピングファイルからJavaソースを生成

  • build.xml(★コメント入り)
<target name="codegen">
  <hbmtool destdir="${source.root}">    ★*.javaの出力先。
    <configuration>
      <fileset dir="${source.root}">
        <include name="**/*.hbm.xml" />
      </fileset>
    </configuration>
    <hbm2java />
  </hbmtool>
</target>

Hibernateのコンフィグ

Hibernateのコンフィグには、hibernate.cfg.xmlかhibernate.propertiesのどちらかを使います。JDBCとehcache用の情報を定義する程度ならhibernate.propertiesの方が書きやすいです。

  • hibernate.properties
#DATABASENAME、USERNAME、PASSWORDは、適宜変更のこと。
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:postgresql://localhost:5432/DATABASENAME
hibernate.connection.username=USERNAME
hibernate.connection.password=PASSWORD

#org.ehcache.disabled=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.provider_configuration_file_resource_path=/ehcache.xml

hbm2ddl ~ マッピングファイルからスキーマ(テーブル)を生成

  • build.xml(★コメント入り)
<target name="schemagen" depends="compile">
  <hbmtool destdir="">
    <configuration>
      <fileset dir="${class.root}">
        <include name="**/*.hbm.xml" />
      </fileset>
    </configuration>
    <hbm2ddl export="false" outputfilename="createTables.sql" format="true" />
                    ★DBは変更せず、SQLスクリプトファイルを生成。
                    ★直接DBを変更するなら、<hbm2ddl export="true" />とする。
  </hbmtool>
</target>

hbm2hbmxml ~ 既存スキーマからマッピングファイルを生成

  • build.xml(★コメント入り)
<target name="hbmgen" depends="prepare">
  <hbmtool destdir="${class.root}">     ★別にsource.rootでも構いませんが…。
    <jdbcconfiguration
      propertyfile="${class.root}/hibernate.properties"
                                        ★hibernate.cfg.xmlを使う場合、属性名はconfigurationfile。
      packagename="${package.name}"     ★マッピングファイルのパッケージ名。
      revengfile="${class.root}/hibernate.reveng.xml" />
    <hbm2hbmxml />
  </hbmtool>
</target>
  • hibernate.reveng.xml(★コメント入り)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC 
  "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">

<hibernate-reverse-engineering>
  <table-filter match-name="TRACK"/>    ★変換対象のテーブル名。
</hibernate-reverse-engineering>

ドキュメント

Hibernateは、RedHatのJBossプロジェクトの中でメンテされています。HibernateToolsはJBossToolsの一部です。直リンクですが、ドキュメントのリンク先を挙げておきます。

Last modified:2011/05/31 22:00:53
Keyword(s):
References:[言語Tips]
This page is frozen.