初心者のためのハイバネートチュートリアル
初めてのためのHibernateチュートリアルへようこそ。Hibernateは最も広く使われているJava ORMツールの一つです。ほとんどのアプリケーションは、アプリケーション情報を保存するためにリレーショナルデータベースを使用し、低レベルではJDBC APIを使用してデータベースに接続し、CRUD操作を実行します。
初心者のためのハイバネートチュートリアル
JDBCコードを見ると、膨大なボイラープレートコードがあり、すべての作業を開発者が行う必要があるため、リソースリークやデータの不整合が発生する可能性があります。ここでORMツールが役立ちます。オブジェクトリレーショナルマッピング(ORM)は、アプリケーションドメインモデルのオブジェクトをリレーショナルデータベースのテーブルにマップするプログラミング技法です。Hibernateは、アプリケーションドメインオブジェクトをリレーショナルデータベースのテーブルにマッピングするためのフレームワークを提供するJavaベースのORMツールです。HibernateをORMツールとして使用する利点のいくつかは次のとおりです:
- Hibernateは、Javaクラスをデータベースのテーブルにマッピングし、その逆もサポートしています。主要なリレーショナルデータベース全体でCRUD操作を実行するための機能を提供します。
- HibernateはJDBCに伴うすべてのボイラープレートコードを排除し、リソースの管理を行うため、私たちはデータベース操作がリソースリークを引き起こさないことを確認するのではなく、ビジネスユースケースに集中できます。
- Hibernateはトランザクション管理をサポートし、システム内に不整合なデータが存在しないことを確実にします。
- 私たちはXML、プロパティファイル、またはアノテーションを使用してJavaクラスをデータベースのテーブルにマッピングするため、アプリケーションとデータベースの間に抽象化層を提供します。
- Hibernateは、ジョイン、コレクション、継承オブジェクトのマッピングを助け、モデルクラスがデータベースのテーブルをどのように表現しているかを簡単に視覚化することができます。
- HibernateはSQLに似た強力なクエリ言語(HQL)を提供します。ただし、HQLは完全にオブジェクト指向であり、継承、多態性、関連付けといった概念を理解しています。
- Hibernate は、いくつかの外部モジュールとの統合も提供しています。たとえば、Hibernate Validator は Bean Validation (JSR 303) のリファレンス実装です。
- HibernateはRed Hatコミュニティからのオープンソースプロジェクトで、世界中で使用されています。これにより、他の選択肢よりも学習曲線が小さく、オンラインのドキュメントやフォーラムでのサポートが簡単に得られるため、より良い選択肢となります。
- Hibernateは他のJava EEフレームワークと統合するのが容易であり、非常に人気があるため、Spring FrameworkはHibernateをSpringアプリケーションと統合するためのビルトインサポートを提供しています。
上記のすべての利点が、Hibernateがあなたのアプリケーションのオブジェクト-リレーショナルマッピングの要件に最適な選択であることを納得させることを願っています。それでは、次にHibernateフレームワークのアーキテクチャを見て、その後、スタンドアロンのJavaアプリケーションでHibernateを構成し使用するさまざまな方法を見ていくサンプルプロジェクトに飛び込みましょう。
ハイバネートアーキテクチャ
下の画像は、Hibernateアーキテクチャと、それがアプリケーションクラスとデータベース操作のためのJDBC/JTA APIとの間に抽象化レイヤーとしてどのように機能するかを示しています。HibernateがJDBCとJTA APIの上に構築されていることは明らかです。
- SessionFactory (org.hibernate.SessionFactory): SessionFactoryは、単一のデータベース用にコンパイルされたマッピングの不変でスレッドセーフなキャッシュです。
SessionFactoryを使用してorg.hibernate.Sessionのインスタンスを取得できます。 - セッション (org.hibernate.Session): セッションは、アプリケーションと永続ストアとの間の会話を表す、単一スレッドで短命のオブジェクトです。これはJDBC
java.sql.Connectionをラップし、org.hibernate.Transactionのファクトリーとして機能します。 - 永続オブジェクト: 永続オブジェクトは、永続的な状態とビジネス機能を含む短命で単一スレッドのオブジェクトです。これらは普通のJavaBeans/POJOです。これらは正確に1つの
org.hibernate.Sessionに関連付けられています。 - 一時オブジェクト: 一時オブジェクトは、現在
org.hibernate.Sessionに関連付けられていない永続クラスのインスタンスです。それらはアプリケーションによってインスタンス化され、まだ永続化されていないものであるか、または閉じられたorg.hibernate.Sessionによってインスタンス化されたものである可能性があります。 - トランザクション (org.hibernate.Transaction): トランザクションは、アプリケーションが原子的な作業単位を指定するために使用する単一スレッド、短命なオブジェクトです。これは、アプリケーションを基盤となるJDBCまたはJTAトランザクションから抽象化します。場合によっては、
org.hibernate.Sessionが複数のorg.hibernate.Transactionを跨ぐことがあります。 - ConnectionProvider (org.hibernate.connection.ConnectionProvider): ConnectionProviderは、JDBC接続のファクトリです。アプリケーションと基盤となる
javax.sql.DataSourceまたはjava.sql.DriverManagerの間の抽象化を提供します。アプリケーションには公開されていませんが、開発者によって拡張することができます。 - TransactionFactory (org.hibernate.TransactionFactory):
org.hibernate.Transactionインスタンスのファクトリーです。
ハイバネートとJava Persistence API (JPA)
HibernateはJava Persistence APIの実装を提供しているため、モデルビーンにJPAアノテーションを使用でき、HibernateがCRUD操作で使用されるように設定を行います。アノテーションの例を通じてこれを見ていきます。
ハイバネートの例
Hibernateアプリケーションを開発する際には、2つのセットの設定を提供する必要があります。最初のセットの設定には、データベース接続およびセッションオブジェクトを作成するために使用されるデータベース特有のプロパティが含まれています。2番目の設定セットには、モデルクラスとデータベーステーブルとのマッピングが含まれています。データベース接続に関連する設定には、XMLベースまたはプロパティベースの設定を使用できます。モデルクラスとデータベーステーブルのマッピングを提供するためには、XMLベースまたはアノテーションベースの設定を使用できます。アノテーションベースのマッピングには、javax.persistenceからのJPAアノテーションを使用します。最終的なプロジェクトは以下の画像のようになります。
データベーステーブルの設定
私の例では、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;
従業員テーブルの「id」列はMySQLによって自動的に生成されるため、挿入する必要はありません。
ハイバーネートプロジェクトの依存関係
私たちの最終的な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.journaldev.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を使用しているため、Hibernate 4を使用しているにもかかわらず、プロジェクトにslf4j-simple アーティファクトを含めましたが、必要ではありませんでした。mysql-connector-javaはMySQLデータベースに接続するためのMySQLドライバーで、別のデータベースを使用している場合は、それに対応するドライバーアーティファクトを追加してください。
ドメインモデルクラス
上の画像に示されているように、私たちは2つのモデルクラス、EmployeeとEmployee1を持っています。EmployeeはシンプルなJava Beanクラスであり、そのマッピングの詳細を提供するためにXMLベースの設定を使用します。Employee1はフィールドがJPAアノテーションで注釈されたJava Beanであるため、別のXMLファイルでマッピングを提供する必要がありません。
package com.journaldev.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 Beanであり、ここで特に議論すべきことはありません。
package com.journaldev.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 によって永続化できるエンティティビーンとしてクラスをマークするために使用されます。Hibernate は JPA 実装を提供します。javax.persistence.Table アノテーションは、テーブルのマッピングと列の一意制約を定義するために使用されます。javax.persistence.Id アノテーションは、テーブルの主キーを定義するために使用されます。javax.persistence.GeneratedValue は、そのフィールドが自動生成されることを定義し、GenerationType.IDENTITY ストラテジーが使用されるため、生成された「id」値がビーンにマッピングされ、Java プログラム内で取得できるようになります。javax.persistence.Column は、フィールドをテーブルの列にマッピングするために使用され、ビーンプロパティの長さ、nullable(null 許可)、一意性を指定することもできます。
ハイバーネートマッピングXML構成
上記のように、従業員クラスのマッピングにはXMLベースの設定を使用します。任意の名前を選択できますが、明確さのためにテーブル名やJava Bean名に基づいて選ぶのが良いでしょう。従業員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.journaldev.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ベースの設定用とアノテーションベースの設定用の2つのHibernate設定XMLファイルを作成します。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">pankaj</property>
<property name="hibernate.connection.password">pankaj123</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-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">pankaj</property>
<property name="hibernate.connection.password">pankaj123</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.journaldev.hibernate.model.Employee1"/>
</session-factory>
</hibernate-configuration>
ほとんどの設定はXMLベースの設定と同じですが、唯一の違いはマッピング設定です。クラスとパッケージの両方に対してマッピング設定を提供できます。
ハイバーネート セッションファクトリー
私は、XMLベースの設定とプロパティベースの設定からSessionFactoryを作成するユーティリティクラスを作成しました。プロパティベースの設定の場合、プロパティファイルを用意してクラス内で読み取ることもできますが、簡単さのために、クラス内でPropertiesインスタンスを作成しています。
package com.journaldev.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.journaldev.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", "pankaj");
props.put("hibernate.connection.password", "pankaj123");
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/journaldev/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;
}
}
SessionFactory を XML ベースの設定で作成することは、マッピングが XML ベースであろうとアノテーションベースであろうと同じです。プロパティベースの場合、Configuration オブジェクトにプロパティを設定し、SessionFactory を作成する前にアノテーションクラスを追加する必要があります。全体として、SessionFactory を作成する際の手順は次のとおりです:
Configurationオブジェクトを作成し、それを構成するServiceRegistryオブジェクトを作成し、設定を適用します。ServiceRegistryオブジェクトを引数として渡してconfiguration.buildSessionFactory()を使用し、SessionFactoryオブジェクトを取得します。
私たちのアプリケーションはほぼ準備が整いましたので、いくつかのテストプログラムを書いて実行しましょう。
ハイバーネートXML設定テスト
私たちのテストプログラムは以下のようになります。
package com.journaldev.hibernate.main;
import java.util.Date;
import org.hibernate.Session;
import com.journaldev.hibernate.model.Employee;
import com.journaldev.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=pankaj, 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が印刷されていることに注意してください。これを確認するためにデータベースのテーブルを確認できます。
ハイバーネートアノテーション設定テスト
package com.journaldev.hibernate.main;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.journaldev.hibernate.model.Employee1;
import com.journaldev.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=pankaj, 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.journaldev.hibernate.main;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.journaldev.hibernate.model.Employee1;
import com.journaldev.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=pankaj, 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チュートリアルは終わりです。これがあなたのスタートに十分であることを願っています。今後のチュートリアルではHibernateフレームワークのさまざまな機能を見ていきます。以下のリンクから完全なプロジェクトをダウンロードして、さらに学ぶために試してみてください。
Hibernate初心者プロジェクトをダウンロードする


