Hibernateで遊ぼう

とーとつにHibernate環境構築記事。(^^;

Javaは1.4.2_05が入っていることを前提とします。また、データベースにはMySQLを使い、MySQLの設定方法も含めて紹介します。

まずは、MySQLの入手です。
MySQL Downloadsから、MySQL 4.1を選択。Windows downloadsからWindows (x86) 4.1.5-gamma(9/25現在の最新)をダウンロード。また、JavaからMySQLへ接続するためのAPIも必要なので、先ほどのページに戻ってMySQL Connector/J 3.0もダウンロードします。

ダウンロードしたmysql-4.1.5-gamma-win.zipを解凍してsetup.exeを実行します。以下、インストーラ上での作業内容です。

  1. 最初の画面。Nextボタンを押して次へ。
  2. インストール先フォルダを指定する。デフォルトでよければそのまま次へ。
  3. セットアップタイプはとりあえずTypicalでいいでしょ。次。
  4. インストールの準備ができましたといっているのでInstallボタンを押す。
  5. MySQL.comへのサインアップ要求。アカウントがないのでCreate a new free MySQL.com accountを選んで次へ。
  6. メールアドレスとパスワードを入力して次へ。
  7. FirstName/LastNameを入力して次へ。
  8. Postal Codeに郵便番号、CountryにJapan、State/ProvinceにOther or N/Aを入力して次へ。
  9. 確認画面が出るので問題がなければ次へ。
  10. インストール完了。Configure the MySQL Server nowにチェックがついているのでそのまま、Finishボタンを押してセッティングへ。
  11. MySQL Server Instance Configuration Wizardが起動される。次へ。
  12. Detailed Configurationが選択されているのでそのまま次へ。
  13. Developer Machineが選択されているのでそのまま次へ。
  14. Multifunctional Databaseが選択されているのでそのまま次へ。
  15. データベースファイルの置き場を聞かれるので問題がなければそのままインストールディレクトリとして次へ。
  16. 接続数は少なくてもいいのですが、とりあえず選択されているDecision Support(DSS)/OLAPのまま次へ。
  17. ポート番号は問題がなければデフォルトの3306として次へ。
  18. 文字コードの選択。せっかくバージョン4.1を入れているので、Best Support for Multiingualism(UTF-8)を選択しましょう。次へ。
  19. Install As Windows Service。Windows 2K/XPならサービスとして動かすことにして、次へ。
  20. ルートのパスワードを入れて次へ。
  21. Executeボタンを押して実行。
  22. Finshボタンで終了。おつかれさまでした。

データベースの用意ができたので、いよいよHibernateにチャレンジ。目標はJavaのクラスUserとデータベーステーブルUsersをマッピングすることです。
このクラスを・・・

// 目的のクラス
public class User {
  String id = null;
  String password = null;

  User (String userID, String pw) {
    id = userID;
    password = pw;
  }

  User() {}

  public String getID() {
    return id;
  }
  public void setID(String newUser) {
    id = newUser;
  }

  public String getPassword() {
    return password;
  }
  public void setPassword(String pw) {
    password = pw;
  }
}

こいつにマッピングしたい。

 +----------+-------------+------+-----+---------+-------+
 | Field    | Type        | Null | Key | Default | Extra |
 +----------+-------------+------+-----+---------+-------+
 | id       | varchar(20) |      | PRI |         |       |
 | password | varchar(20) | YES  |     | NULL    |       |
 +----------+-------------+------+-----+---------+-------+

まずは、データベースを作りましょう。
スタートメニュー > すべてのプログラム > MySQLMySQL Server 4.1 > MySQL Command Line Shellを選択。パスワードを入れてログインします。

mysql>

というプロンプトが出ましたよね。では、早速データベースを作成します。

mysql> create database mydb;

これで、mydbというデータベースが作成されました。このデータベースにusersテーブルを作りたいと思います。

mysql> connect mydb;

今作ったばかりのmydbデータベースに接続します。で、create table文でテーブルを作成します。

create table users (
  id      varchar(20)  not null,
  password   varchar(20),
  primary key(id)
);

こんなの。まぁ、折角なのでデータも入れておきましょう。

mysql> insert into users values('taro', 'ringo');

あと、データベースユーザがrootのままというのも気分的によろしくないのでユーザも作っておきます。

mysql> grant select,insert,delete,update,create,drop,file,alter,index 
mysql> on *.* to user identified by 'pass';

これで、ユーザ名がuser、パスワードがpassというユーザが作成されました。

ここで、データベース作業は一旦終えて、Javaプログラミングに移ります。まず、作業はc:\myprojで行っていることと仮定して話をすすめます。目標はJavaオブジェクトとデータベースとのマッピング。なので、JavaからMySQLのデータベースにアクセスしなければなりません。まずは、最初にダウンロードしたConnector/J 3.0を解凍して、mysql-connector-java-3.0.15-ga-bin.jarをc:\myprojへコピーします。

また、オブジェクトマッピングに使うHibernateここからダウンロードしてきます。2004/9/25時点では2.1.6が最新です。hibernate-2.1.6.zipを解凍し、libディレクトリのREADME.txt読むとrequiredとなっているライブラリがいくつかありますので、それらをc:\myprojへコピーします。

  • cglib-full.jar (2.0.2)
  • commons-collections.jar (2.1.1)
  • commons-logging.jar (1.0.4)
  • dom4j.jar (1.4)
  • ehcache.jar (0.8)
  • hibernate2.jar (2.1)
  • jta.jar
  • odmg.jar (3.0)

バージョン番号がくっついていますが、これら8つです。コンパイルおよび実行にこれらライブラリが必要なので、classpathを設定するバッチを用意しておくと楽かも知れません。コンパイル前にたたき忘れないように。(^^;

@echo off
set classpath=.
set classpath=%classpath%;mysql-connector-java-3.0.15-ga-bin.jar
set classpath=%classpath%;cglib-full-2.0.2.jar
set classpath=%classpath%;commons-collections-2.1.1.jar
set classpath=%classpath%;commons-logging-1.0.4.jar
set classpath=%classpath%;dom4j-1.4.jar
set classpath=%classpath%;ehcache-0.9.jar
set classpath=%classpath%;hibernate2.jar
set classpath=%classpath%;odmg-3.0.jar

User.javaファイルを作って以下のコードを打ち込んでください。

// User.java
public class User {
  String id = null;
  String password = null;

  User (String userID, String pw) {
    id = userID;
    password = pw;
  }

  User() {}

  public String getID() {
    return id;
  }
  public void setID(String newUser) {
    id = newUser;
  }

  public String getPassword() {
    return password;
  }
  public void setPassword(String pw) {
    password = pw;
  }
}

続いてHibernateで使うUserクラス用のマッピングファイルを作成します。ファイル名はUser.hbm.xmlとします。

<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
  "-//Hibernate/Hibernate Mapping DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="User" table="users">
        <id name="ID" column="id"  type="string" >
            <generator class="assigned" />
        </id>
        <property name="password" column="password" type="string" />
    </class>
</hibernate-mapping> 

このファイルでデータベースとクラスの関連付けを行ってします。
また、Hibernateではもうひとつ、データベースの位置やドライバー、ログインユーザに関する設定ファイルも必要になります。ファイル名をhibernate.cfg.xmlとして、内容は以下のとおりとします。

<?xml version="1.0" ?>
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >
<hibernate-configuration>
<session-factory>
        <!--MySQL JDBC Driver connection -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost/mydb</property>
        <property name="connection.username">user</property>
        <property name="connection.password">pass</property>
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="use_outer_join">true</property>
        <!-- Mapping files -->
        <mapping resource="User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

ファイルの中身を注意深く見てみると、

  • connection.urlがmydbを指定している。
  • username/passwordが作成したuser/passになっている。
  • mapping resourceに上記で作成したUser.hbm.xmlが設定されている。

ということに気づきますね。ここで今までの作業がようやく結びつきました。

ついに、データベースとオブジェクトのマッピングが可能になったので、早速、テストプログラムをこさえてみます。

// MySample.java
import java.util.*;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;

public class MySample {
  public static void main(String[] args) throws HibernateException {
    Configuration cfg = new Configuration();
    cfg = cfg.configure();
    SessionFactory sf = cfg.buildSessionFactory();
    Session s = sf.openSession();

    List list = s.createCriteria(User.class).list();

    for (int i = 0; i < list.size(); ++i) {
      User u = (User)list.get(i);
      System.out.println("id=" + u.getID() + " password=" + u.getPassword());
    }
  }
}

ではコンパイルです。

> javac User.java
> javac MySample.java

いよいよ実行です。

> java MySample

大量のメッセージが表示されたあと、一番最後に、

id=taro password=ringo

ユーザtaroはありましたでしょうか?これはテーブル作成時におまけで突っ込んだデータですね。このための伏線だったり。(^^;

ここまでくれば、このサンプルを発展させHibernateを使って色々遊べると思います。と、言うか、ここで力尽きました・・・