Hibernate Annotations アノテーションを使った効率の良いHibernate開発
従来のHibernate開発ではBeanとテーブルのマッピングを○○.hbm.xmlファイルに記述していたが、バージョン3.5より、アノテーションを利用した効率の良い利用方法がサポートされた。
Quickstart
Eclipse(JavaSE6)+MySQLで、利用するまでの手順
環境
-Eclipse
–m2eclipse(Eclipse用Maven2プラグイン)→設定方法
-JavaSE6
-MySQL(5.1.41)
手順
1.Eclipseの起動
2.Mavenプロジェクトの作成
シンプルプロジェクト。ロケーションを設定(デフォルトでOK)

GroupId, ArtifactIdを入力

GroupId:開発グループのID
ArtifactId:製品ID
ここまでいつもどおり。
3.依存プロダクトの入手(pom.xml)
生成されたプロジェクトのpom.xmlを右クリックし、コンテキストメニューからMaven→Add Dependencyを選択。

hibernate関係のライブラリ依存を設定する
Enter groupId, artifactId … の欄に、「org.hibernate」と入力。以下のプロダクトをそれぞれ選択する。
- org.hibernate : hibernate-core-3.3.2.GA.jar
- org.hibernate : hibernate-annotations-3.4.0.GA.jar
- org.hibernate : hibernate-entitymanager-3.4.0.GA.jar
おなじく、「mysql」と入力。以下のプロダクトを選択する。
- mysql : mysql-connector-java-5.1.12.jar
最後にSlf4j(ロギング)のライブラリ。「org.slf4j」と入力
- org.slf4j : slf4j-api-1.6.0.jar
- org.slf4j : slf4j-nop-1.6.0.jar
それぞれ、実行時の最新バージョンを選択すること。
ライブラリの更新
パッケージエクスプローラからプロジェクトを右クリックし、コンテキストメニューからMaven→Update Dependencyを選択。

ここまで3分くらい。
DBの用意
CREATE TABLE IF NOT EXISTS `emp` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; INSERT INTO `emp` (`id`, `name`) VALUES (1, 'たろう'), (2, 'じろう');
コンフィグファイル(hibernate.cfg.xml)の作成
Hibernateがデータベース接続をおこなうための設定ファイルをクラスパスが通っているディレクトリに格納する。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping package="sample" />
<mapping class="sample.Emp"/>
</session-factory>
</hibernate-configuration>
エンティティクラス(hibernate.cfg.xml)の作成
テーブルのレコードを表すクラス(エンティティクラス)を、sampleパッケージに生成
package sample;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "EMP")
public class Emp {
@Id
public Integer id;
public String name;
}
実行
実行用クラス。
package sample;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class Main {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.openSession();
List<Emp> empList = session.createCriteria(Emp.class).list();
for (Emp emp : empList) {
System.out.println(emp.name);
}
}
}
結果
Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from EMP this_
たろう
じろう
超簡単!
Hibernate – 一意キーとGenerator
一意キーとGenerator
例
<hibernate-mapping>
<class name="dto.EmpDto" table="Emp">
<id name="id" column="id">
<generator class="increment" />
</id>
</class>
</hibernate-mapping>
ここでincrementと指定を行っているのがGeneratorである。
Generator一覧
| Generator | 特徴 |
|---|---|
| increment | プリミティブ整数(int, long, short)型のデータを自動採番する。他プロセスがレコード挿入を行う場合、不具合が発生する。 |
| identity | データベースが提供する一意カラムを利用する。 |
| sequence | データベースが提供する順序ジェネレーターを利用する。 |
| hilo | 効率のよいHi/Loアルゴリズムを利用する。特別なテーブルを利用する。 |
| seqhilo | 効率のよいHi/Loアルゴリズムを利用する。順序ジェネレーターを利用する。 |
| uuid.hex | 128bitUUIDアルゴリズムを利用する。長さが32の文字列にエンコードされる。 |
| uuid.string | 同上。長さが16の文字列にエンコードされる。 |
| native | データベースによって利用するアルゴリズムが決定される。 |
| assigned | save()実行前にアプリケーションが識別子を設定しておく。 |
| foreign | 他の関連オブジェクトの識別子を使う。通常は一対一で対応する外部キーを利用する。 |
Hibernate – 定義ファイルによる様々な設定
定義ファイルによる様々な設定
Hibernateプロパティ – JDBC
| プロパティ名 | 目的 |
|---|---|
| hibernate.connection.driver_class | ドライバクラス |
| hibernate.connection.url | URL |
| hibernate.connection.username | ユーザ |
| hibernate.connection.password | パスワード |
| hibernate.connection.pool_size | プールできるコネクションの最大数 |
Hibernateプロパティ – JNDIデータソース
| プロパティ名 | 目的 |
|---|---|
| hibernate.connection.datasource | JNDI名 |
| hibernate.jndi.url | プロバイダURL |
| hibernate.jndi.class | InitialContextFactoryのクラス |
| hibernate.connection.username | ユーザ |
| hibernate.connection.password | パスワード |
その他共通のオプションはHibernateの日本語マニュアル(http://www.hibernate.org/hib_docs/reference/ja/html_single/#configuration-optional)を参照。
データベースの差異による方言の吸収
様々な有償/無償のデータベースがあるが、それぞれ独自の構文を採用していることもある。Hibernateでは、org(2.xではnet.sf).hibernate.dialect.Dialectの派生クラスにより、方言を吸収する。
利用するクラスの指定はHibernateプロパティのhibernate.dialectに対して指定する。hibernate.dialectプロパティの指定は必須にはなっていないが、必ず指定するようにする。
クラス一覧(データベースとの対応はクラス名の通り。Hibernate2.xの場合はorg.hibernate→net.sf.hibernate)
- org.hibernate.dialect.DB2Dialect
- org.hibernate.dialect.DB2390Dialect
- org.hibernate.dialect.DB2400Dialect
- org.hibernate.dialect.DerbyDialect
- org.hibernate.dialect.FrontBaseDialect
- org.hibernate.dialect.GenericDialect
- org.hibernate.dialect.HSQLDialect
- org.hibernate.dialect.InformixDialect
- org.hibernate.dialect.IngresDialect
- org.hibernate.dialect.InterbaseDialect
- org.hibernate.dialect.FirebirdDialect
- org.hibernate.dialect.MckoiDialect
- org.hibernate.dialect.MySQLDialect
- org.hibernate.dialect.MySQLInnoDBDialect
- org.hibernate.dialect.MySQLMyISAMDialect
- org.hibernate.dialect.Oracle9Dialect
- org.hibernate.dialect.OracleDialect
- org.hibernate.dialect.PointbaseDialect
- org.hibernate.dialect.PostgreSQLDialect
- org.hibernate.dialect.ProgressDialect
- org.hibernate.dialect.SAPDBDialect
- org.hibernate.dialect.SybaseDialect
- org.hibernate.dialect.SQLServerDialect
- org.hibernate.dialect.SQLServer7Dialect
- org.hibernate.dialect.Sybase11Dialect
- org.hibernate.dialect.SybaseAnywhereDialect
- org.hibernate.dialect.TimesTenDialect





