Hibernate Annotations アノテーションを使った効率の良いHibernate開発

8月 8, 2010 · Posted in Eclipse, Hibernate · Comment 

従来のHibernate開発ではBeanとテーブルのマッピングを○○.hbm.xmlファイルに記述していたが、バージョン3.5より、アノテーションを利用した効率の良い利用方法がサポートされた。

Quickstart

Eclipse(JavaSE6)+MySQLで、利用するまでの手順

環境

-Eclipse
–m2eclipse(Eclipse用Maven2プラグイン)→設定方法
-JavaSE6
-MySQL(5.1.41)

手順

1.Eclipseの起動

2.Mavenプロジェクトの作成

ファイル→新規→その他→Maven→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

1月 1, 2003 · Posted in Hibernate · Comment 

一意キーとGenerator

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 – 定義ファイルによる様々な設定

1月 1, 2003 · Posted in Hibernate · Comment 

定義ファイルによる様々な設定

HibernateではHibernateプロパティを利用して、様々な定義を行う。Hibernateプロパティはorg(2.xではnet.sf).hibernate.cfg.Environmentクラスに定義されている。

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

次ページへ »