WEB+DB PRESS編集部
技術評論社 (2005/08/25)
売り上げランキング: 4,363
# とりあえず、時間も時間なので適当にメモです。気が向いたらもうちょっと突っ込んで書くかもです。
WEB+DB PRESS Vol.28の「EJB3時代のデータベース設計」という特集の中でHibernateの面白そうな使い方が書いてありました。
記事中ではHibernate Annotationsを使ってEJB3.0ライクにAnnotationによってマッピングファイルを使うことなくEntitiy Beanを実装する方法が記述されていました。
というわけで、久々にHibernateに触れてみました。
これまではマッピングファイルによってTop-Downにデータベースのスキーマを生成していましたが、Hibernate + Hibernate Annotation + Hibernate Toolsで同様のことができます。Hibernate Ant Toolsのドキュメントに詳しく書かれています。
Hibernate Toolsは本来Hibernateをより簡単に扱うためのEclipseプラグインなのですが、そのコアクラスにはAnt用のタスククラスが含まれています。その中にHibernate Annotationsと連携するSchemaExportなクラスが含まれているのでこいつを利用します。
ただし、現在配布されているHibernate 3.1 beta 2、Hibernate Annotations 3.1 beta 4、Hibernate Tools 3.1 alpha 5の組み合わせではAPIの非互換性から動かないのでCVSリポジトリから最新のコードを取得してコンパイルする必要があります。
HibernateはHibernate3のリポジトリ、AnnotationsとToolsはHibernateExtのリポジトリに含まれます。厳密にはAnnotationsはHibernateExt/metadataに、ToolsはHibernateExt/toolsに含まれますが、コンパイルにHibernateExtのリポジトリがごっそり必要なので要注意です。
それぞれをコンパイルしてhibernate3.jarと必要なライブラリ群、hibernate-annotations.jarとejb3-persistence.jar、hibernate-tools.jar、JDBCドライバ(今回はMySQLを使用)を${project}/libにコピーして
Employee.java
package net.hide_k;
import javax.persistence.*;
@Entity(access = AccessType.PROPERTY)
@Table(name = "t_employee")
public class Employee {
private Long id;
private String name;
@Id(generate = GeneratorType.IDENTITY)
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
みたいなコードを書いて${project}/binにコンパイルしておきます。
${project}に接続用の設定ファイルとして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>
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernatetest</property>
<property name="hibernate.connection.username">hoge</property>
<property name="hibernate.connection.password">hoge</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping package="net.hide_k"/>
<mapping class="net.hide_k.Employee"/>
</session-factory>
</hibernate-configuration>
スキーマ作成用のAntビルドファイル(schemaExport-build.xml)を以下のように作成します。
<?xml version="1.0" encoding="UTF-8"?>
<project name="Hibernate Annotations" default="schemaExport">
<property name="build.dir" value="bin"/>
<property name="lib.dir" value="lib"/>
<path id="lib.class.path">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
<pathelement path="${build.dir}" />
</path>
<target name="schemaExport">
<taskdef
name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="lib.class.path"/>
<hibernatetool destdir="./">
<annotationconfiguration configurationfile="hibernate.cfg.xml"/>
<hbm2ddl drop="false"/>
</hibernatetool>
</target>
</project>
で、このビルドファイルでantすれば、めでたくスキーマが生成されます。(もちろんデータベースの器だけはCREATE DATABASEしておく必要があります。)
まだまだBetaやAlphaということもありますが、膨大なマッピングファイルが消え去るのはちょっと気持ちいいかもしれません。
追記 (2005/09/13 21:38)
本来@Tableを使うにあたってjavax.persistence.Tableをインポートすべきところをorg.hibernate.annotations.Tableをインポートしてました。ごめんなさい。