初心者向けのHibernateチュートリアル

初心者のためのHibernateチュートリアルへようこそ。Hibernateは、最も広く使用されているJavaのORMツールの一つです。ほとんどのアプリケーションは、リレーショナルデータベースを使用してアプリケーション情報を保存し、低レベルではJDBC APIを使用してデータベースに接続し、CRUD操作を実行します。

初心者のためのヒベルネートチュートリアル

JDBCのコードを見ると、大量の定型コードがあり、リソースの漏洩やデータの不整合の可能性があります。これは、すべての作業が開発者によって行われるためです。ここがORMツールの役割です。オブジェクト関係マッピング(ORM)は、アプリケーションドメインモデルオブジェクトを関係データベースのテーブルにマッピングするプログラミング技術です。Hibernateは、アプリケーションドメインオブジェクトを関係データベースのテーブルにマッピングし、逆も行うJavaベースのORMツールです。HibernateをORMツールとして使用することのいくつかの利点は次のとおりです。

    1. Hibernateは、Javaのクラスをデータベースのテーブルにマッピングし、その逆もサポートしています。また、主要なリレーショナルデータベース全体でCRUD操作を実行するための機能も提供しています。

 

    1. Hibernateは、JDBCに付随する冗長なコードを排除し、リソースの管理にも気を配ってくれるため、データベース操作がリソースの漏洩を引き起こしていないかを確認する必要を考える必要がありません。そのため、ビジネスユースケースに集中することができます。

 

    1. Hibernateはトランザクション管理をサポートし、システム内に一貫性のないデータが存在しないようにします。

 

    1. Javaのクラスをデータベースのテーブルにマッピングするために、XML、プロパティファイル、アノテーションを使用するため、アプリケーションとデータベースの間に抽象化層を提供します。

 

    1. Hibernateは、結合、コレクション、継承オブジェクトのマッピングをサポートし、モデルクラスがデータベースのテーブルをどのように表しているかを簡単に可視化することができます。

 

    1. Hibernateは、SQLに似たパワフルなクエリ言語(HQL)も提供しています。ただし、HQLは完全にオブジェクト指向であり、継承、多態性、関連性などの概念を理解します。

 

    1. Hibernateは、外部モジュールとの統合も提供しています。たとえば、Hibernate ValidatorはBean Validation(JSR 303)のリファレンス実装です。

 

    1. Hibernateは、Red Hat Communityのオープンソースプロジェクトであり、世界中で使用されています。これは、学習曲線が小さく、オンラインドキュメントが豊富で、フォーラムでのヘルプも簡単に利用できるため、他の選択肢よりも優れた選択肢となります。

 

    Hibernateは他のJava EEフレームワークと簡単に統合することができ、Spring FrameworkではHibernateをSpringアプリケーションに統合するための組み込みサポートも提供されています。

上記の利点がすべてあなたを納得させ、Hibernateがアプリケーションのオブジェクトリレーショナルマッピング要件において最良の選択肢であることを願っています。では、Hibernateのフレームワークアーキテクチャを見て、それから独立したJavaアプリケーションでHibernateを設定し使用するさまざまな方法について調べていきましょう。

ヒバネートのアーキテクチャ

以下の画像は、Hibernateのアーキテクチャとその動作方法を示しており、アプリケーションクラスとデータベース操作のためのJDBC / JTA APIとの間の抽象化レイヤーとして機能します。明らかにHibernateは、JDBCおよびJTA APIの上に構築されています。では、Hibernateアーキテクチャの中核コンポーネントを順番に見てみましょう。

  • SessionFactory (org.hibernate.SessionFactory): SessionFactory is an immutable thread-safe cache of compiled mappings for a single database. We can get instance of org.hibernate.Session using SessionFactory.
  • Session (org.hibernate.Session): Session is a single-threaded, short-lived object representing a conversation between the application and the persistent store. It wraps JDBC java.sql.Connection and works as a factory for org.hibernate.Transaction.
  • Persistent objects: Persistent objects are short-lived, single threaded objects that contains persistent state and business function. These can be ordinary JavaBeans/POJOs. They are associated with exactly one org.hibernate.Session.
  • Transient objects: Transient objects are persistent classes instances that are not currently associated with a org.hibernate.Session. They may have been instantiated by the application and not yet persisted, or they may have been instantiated by a closed org.hibernate.Session.
  • Transaction (org.hibernate.Transaction): Transaction is a single-threaded, short-lived object used by the application to specify atomic units of work. It abstracts the application from the underlying JDBC or JTA transaction. A org.hibernate.Session might span multiple org.hibernate.Transaction in some cases.
  • ConnectionProvider (org.hibernate.connection.ConnectionProvider): ConnectionProvider is a factory for JDBC connections. It provides abstraction between the application and underlying javax.sql.DataSource or java.sql.DriverManager. It is not exposed to application, but it can be extended by the developer.
  • TransactionFactory (org.hibernate.TransactionFactory): A factory for org.hibernate.Transaction instances.

ハイバネートとJava Persistence API(JPA)

ハイバネートはJava Persistence APIの実装を提供しているため、モデルビーンにJPAのアノテーションを使用することができます。また、ハイバネートはCRUD操作のために設定を行ってくれます。このアノテーションの例を使って詳しく説明していきます。

ヒベルネートの例引用

ハイバネートアプリケーションを開発する際には、2つの設定セットを提供する必要があります。最初の設定セットには、データベース接続とセッションオブジェクトの作成に使用されるデータベース固有のプロパティが含まれています。2番目の設定セットには、モデルクラスとデータベーステーブルのマッピングが含まれています。データベース接続に関する設定には、XMLベースまたはプロパティベースの設定を使用することができます。モデルクラスとデータベーステーブルのマッピングを提供する際には、XMLベースまたはアノテーションベースの設定を使用することができます。アノテーションベースのマッピングには、javax.persistenceから提供されるJPAアノテーションを使用します。最終的なプロジェクトは以下の画像のようになります。Eclipseやお好きなIDEでMavenプロジェクトを作成し、自由に名前をつけることができます。プロジェクトのさまざまなコンポーネントに移る前に、データベースのセットアップを行わなければなりません。

データベースのテーブル設定

私の例では、MySQLデータベースを使用しており、以下のスクリプトを使用して必要なテーブルを作成しています。

CREATE TABLE `Employee` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  `insert_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

MySQLによってEmployeeテーブルの「id」列が自動的に生成されるので、私たちはそれを挿入する必要はありません。

ヒベルネートプロジェクトの依存関係

最終的なpom.xmlファイルは以下のようになります。

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.scdev.hibernate</groupId>
  <artifactId>HibernateExample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>HibernateExample</name>
  
  <dependencies>
  	<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.5.Final</version>
  	</dependency>
  	<!-- Hibernate 4 uses Jboss logging, but older versions slf4j for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
        	<groupId>mysql</groupId>
        	<artifactId>mysql-connector-java</artifactId>
        	<version>5.0.5</version>
        </dependency>
  </dependencies>
  
  <build>
  	<finalName>${project.artifactId}</finalName>
  </build>
</project>

hibernate-coreアーティファクトには、すべてのコアハイバネートクラスが含まれているため、プロジェクトに含めることで必要な機能をすべて取得することができます。ただし、私は最新のHibernateバージョン(4.3.5.Final)を使用しているため、Hibernateはまだ進化中であり、すべてのメジャーリリースごとに多くのコアクラスが変更されることを確認しています。したがって、他のバージョンを使用している場合、Hibernateの設定を変更する必要がある可能性があります。ただし、4.x.xのすべてのリリースで正常に動作することは確信しています。Hibernate 4ではJBossログを使用しますが、古いバージョンではログの目的でslf4jを使用しますので、私はslf4j-simpleアーティファクトをプロジェクトに含めています(必要ではありません)。mysql-connector-javaはMySQLデータベースに接続するためのMySQLドライバーです。他のデータベースを使用している場合は、対応するドライバーアーティファクトを追加してください。

ドメインモデルのクラス

上の画像でわかるように、私たちは2つのモデルクラス、EmployeeとEmployee1を持っています。EmployeeはシンプルなJava Beanクラスであり、XMLベースの設定を使用してそのマッピングの詳細を提供します。Employee1は、フィールドにJPAアノテーションが付いたJava Beanですので、別個のXMLファイルでのマッピングを提供する必要はありません。

package com.scdev.hibernate.model;

import java.util.Date;

public class Employee {

	private int id;
	private String name;
	private String role;
	private Date insertTime;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
	
}

従業員クラスはシンプルなJavaビーンですが、特筆すべき点はありません。

package com.scdev.hibernate.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="Employee", 
	   uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})
public class Employee1 {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID", nullable=false, unique=true, length=11)
	private int id;
	
	@Column(name="NAME", length=20, nullable=true)
	private String name;
	
	@Column(name="ROLE", length=20, nullable=true)
	private String role;
	
	@Column(name="insert_time", nullable=true)
	private Date insertTime;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
}

javax.persistence.Entityアノテーションは、Hibernateが提供するJPA実装によって永続化されることができるエンティティビーンとしてクラスをマークするために使用されます。javax.persistence.Tableアノテーションは、テーブルのマッピングと列の一意制約を定義するために使用されます。javax.persistence.Idアノテーションは、テーブルの主キーを定義するために使用されます。javax.persistence.GeneratedValueは、フィールドが自動生成されることを定義し、GenerationType.IDENTITY戦略が使用されるため、生成された「id」の値がビーンにマップされ、Javaプログラムで取得できるようになります。javax.persistence.Columnは、フィールドをテーブル列にマップするために使用され、ビーンのプロパティに対して長さ、nullable、および一意性を指定することもできます。

ヒバネイトのマッピングXMLの設定

上記の通り、社員クラスのマッピングにはXMLベースの設定を使用します。任意の名前を選ぶことができますが、テーブルまたはJava Beanの名前を選ぶことが明確で良いです。Employee BeanのHibernateマッピングファイルは以下のようになります。employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.scdev.hibernate.model.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="role" type="java.lang.String">
            <column name="ROLE" />
        </property>
        <property name="insertTime" type="timestamp">
        	<column name="insert_time" />
        </property>
    </class>
</hibernate-mapping>

XMLの設定はシンプルで、アノテーションベースの設定と同じことをします。

ヒバネイトの設定ファイル

私たちは、xmlベースの設定のための1つのhibernate設定xmlファイルと、アノテーションベースの設定のためのもう1つのファイルを作成します。hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">scdev</property>
		<property name="hibernate.connection.password">scdev123</property>
		<!-- Connection Pool Size -->
		<property name="hibernate.connection.pool_size">1</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Outputs the SQL queries, should be disabled in Production -->
		<property name="hibernate.show_sql">true</property>
		
		<!-- Dialect is required to let Hibernate know the Database Type, MySQL, Oracle etc
			Hibernate 4 automatically figure out Dialect from Database Connection Metadata -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

		<!-- mapping file, we can use Bean annotations too --> 
		<mapping resource="employee.hbm.xml" />
	</session-factory>
</hibernate-configuration>

ほとんどのプロパティはデータベースの設定に関係しており、その他のプロパティの詳細はコメントで説明されています。また、Hibernateのマッピングファイルの設定に注意してください。複数のHibernateマッピングファイルを定義してここで設定することができます。また、マッピングはセッションファクトリーに固有のものです。hibernate-annotation.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">scdev</property>
		<property name="hibernate.connection.password">scdev123</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Mapping with model class containing annotations -->
		<mapping class="com.scdev.hibernate.model.Employee1"/>
	</session-factory>
</hibernate-configuration>

ほとんどの設定はXMLベースの設定と同様ですが、唯一の違いはマッピングの設定です。クラスとパッケージの両方に対してマッピングの設定を提供することができます。

ネイティブな日本語で以下を書き換える(1つのオプションのみ):
ヒバネイトのSessionFactory

私はユーティリティクラスを作成しました。XMLベースの設定とプロパティベースの設定からSessionFactoryを作成しています。プロパティベースの設定では、プロパティファイルを作成し、それをクラスで読み込むことができますが、シンプルさのために、クラス自体でPropertiesインスタンスを作成しています。

package com.scdev.hibernate.util;

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import com.scdev.hibernate.model.Employee1;

public class HibernateUtil {

	//XML based configuration
	private static SessionFactory sessionFactory;
	
	//Annotation based configuration
	private static SessionFactory sessionAnnotationFactory;
	
	//Property based configuration
	private static SessionFactory sessionJavaConfigFactory;

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate.cfg.xml");
        	System.out.println("Hibernate Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static SessionFactory buildSessionAnnotationFactory() {
    	try {
            // Create the SessionFactory from hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate-annotation.cfg.xml");
        	System.out.println("Hibernate Annotation Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate Annotation serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}

    private static SessionFactory buildSessionJavaConfigFactory() {
    	try {
    	Configuration configuration = new Configuration();
		
		//Create Properties, can be read from property files too
		Properties props = new Properties();
		props.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		props.put("hibernate.connection.url", "jdbc:mysql://localhost/TestDB");
		props.put("hibernate.connection.username", "scdev");
		props.put("hibernate.connection.password", "scdev123");
		props.put("hibernate.current_session_context_class", "thread");
		
		configuration.setProperties(props);
		
		//we can set mapping file or class with annotation
		//addClass(Employee1.class) will look for resource
		// com/scdev/hibernate/model/Employee1.hbm.xml (not good)
		configuration.addAnnotatedClass(Employee1.class);
		
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    	System.out.println("Hibernate Java Config serviceRegistry created");
    	
    	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    	
        return sessionFactory;
    	}
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}
    
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
	
	public static SessionFactory getSessionAnnotationFactory() {
		if(sessionAnnotationFactory == null) sessionAnnotationFactory = buildSessionAnnotationFactory();
        return sessionAnnotationFactory;
    }
	
	public static SessionFactory getSessionJavaConfigFactory() {
		if(sessionJavaConfigFactory == null) sessionJavaConfigFactory = buildSessionJavaConfigFactory();
        return sessionJavaConfigFactory;
    }
	
}

XMLベースの設定の場合、アノテーションベースのマッピングに関わらず、SessionFactoryを作成する手順は同じです。プロパティベースの場合は、Configurationオブジェクトにプロパティを設定し、SessionFactoryを作成する前にアノテーションクラスを追加する必要があります。SessionFactoryの作成全体の手順は以下の通りです。

    1. 設定オブジェクトを作成し、それを設定する。

 

    1. ServiceRegistryオブジェクトを作成し、設定を適用する。

 

    configuration.buildSessionFactory() を使用し、ServiceRegistryオブジェクトを引数としてSessionFactoryオブジェクトを取得する。

私たちのアプリケーションはもうほぼ完成していますので、テストプログラムを作成して実行しましょう。

ハイバネートのXML設定のテスト

私たちのテストプログラムは以下のように見えます。

package com.scdev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;

import com.scdev.hibernate.model.Employee;
import com.scdev.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.setName("Pankaj");
		emp.setRole("CEO");
		emp.setInsertTime(new Date());
		
		//Get Session
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		HibernateUtil.getSessionFactory().close();
	}

}

プログラムは自己理解を持っており、テストプログラムを実行すると、以下の出力が得られます。

May 06, 2014 12:40:06 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:40:06 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 06, 2014 12:40:07 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
May 06, 2014 12:40:08 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
Hibernate serviceRegistry created
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=scdev, password=****}
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
May 06, 2014 12:40:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:40:08 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:40:08 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select max(ID) from EMPLOYEE
Hibernate: insert into EMPLOYEE (NAME, ROLE, insert_time, ID) values (?, ?, ?, ?)
Employee ID=19
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

生成された従業員IDが印刷されていることに注意し、データベースのテーブルを確認して確認できます。

ネイティブな日本語で以下をパラフレーズします:Hibernateアノテーションの設定テスト

package com.scdev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.scdev.hibernate.model.Employee1;
import com.scdev.hibernate.util.HibernateUtil;

public class HibernateAnnotationMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("David");
		emp.setRole("Developer");
		emp.setInsertTime(new Date());
		
		//Get Session
		SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
		Session session = sessionFactory.getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		sessionFactory.close();
	}

}

上記のプログラムを実行すると、以下の出力が得られます。

May 06, 2014 12:42:22 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:42:22 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:23 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=scdev, password=****}
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:42:23 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:42:23 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:42:23 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=20
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

出力を見て、XMLベースの設定の出力と比較してみてください。そこにはいくつかの違いが分かるでしょう。例えば、アノテーションベースの設定では接続プールサイズを設定していませんので、デフォルト値である20が設定されます。

ヒバネートのJava設定のテスト

package com.scdev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.scdev.hibernate.model.Employee1;
import com.scdev.hibernate.util.HibernateUtil;

public class HibernateJavaConfigMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		//Get Session
		SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
		Session session = sessionFactory.getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		sessionFactory.close();
	}

}

上記のテストプログラムの出力結果は次のとおりです。

May 06, 2014 12:45:09 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:45:09 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Hibernate Java Config serviceRegistry created
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=scdev, password=****}
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:45:10 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:45:10 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:45:10 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=21
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

初心者向けのハイバネートチュートリアルは以上です。これが十分なスタートになることを願っています。今後のチュートリアルでは、ハイバネートフレームワークのさまざまな機能について詳しく説明します。以下のリンクから完全なプロジェクトをダウンロードして、さらに学ぶために試してみてください。

Hibernate初心者プロジェクトをダウンロードしてください。

コメントを残す 0

Your email address will not be published. Required fields are marked *