初心者向けのHibernateチュートリアルへようこそ。Hibernateは最も広く使われているJava ORMツールの1つです。多くのアプリケーションはアプリケーション情報をリレーショナルデータベースに保存し、低レベルではJDBC APIを使用してデータベースに接続し、CRUD操作を行います。
Hibernateチュートリアル(初心者向け)
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アプリケーションに統合するための組み込みサポートを提供しているほど人気があります。Spring Framework
I hope all the above benefits will convince you that Hibernate is the best choice for your application object-relational mapping requirements. Let’s look at the Hibernate Framework architecture now and then we will jump into sample project where we will look into different ways to configure Hibernate in standalone java application and use it.
ハイバネートアーキテクチャ
下の画像は、ハイバネートのアーキテクチャを示しており、アプリケーションクラスとデータベース操作のためのJDBC/JTA APIとの抽象化レイヤーとしての動作を示しています。明らかにハイバネートはJDBCおよびJTA APIの上に構築されています。では、ハイバネートアーキテクチャのコアコンポーネントを一つずつ見てみましょう。
- SessionFactory(org.hibernate.SessionFactory):SessionFactoryは単一のデータベースのためのコンパイルされたマッピングの不変かつスレッドセーフなキャッシュです。
SessionFactory
を使用してorg.hibernate.Session
のインスタンスを取得できます。 - Session(org.hibernate.Session):Sessionは、アプリケーションと永続ストアの間の対話を表す、単一のスレッドで動作する短寿命のオブジェクトです。JDBCの
java.sql.Connection
をラップし、org.hibernate.Transaction
のファクトリとして機能します。 - 永続オブジェクト:永続オブジェクトは、永続的な状態とビジネス機能を含む短寿命で単一のスレッドのオブジェクトです。これらは通常のJavaBeans/POJOsであり、正確に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
インスタンスのためのファクトリです。
HibernateとJava Persistence API(JPA)
HibernateはJava Persistence APIの実装を提供しており、モデルビーンにJPAアノテーションを使用し、HibernateがそれをCRUD操作で使用するように構成することができます。アノテーションの例でこれを見てみましょう。
Hibernateの例
Hibernateアプリケーションを開発する際には、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;
Employeeテーブルの”id”列はMySQLによって自動的に生成されるため、挿入する必要はありません。
Hibernateプロジェクトの依存関係
最終的な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クラスが含まれているため、プロジェクトに含めることですべての必要な機能を得ることができます。サンプルプロジェクトでは最新のHibernateバージョン(4.3.5.Final)を使用していますが、Hibernateはまだ進化中であり、メジャーリリースごとに多くのコアクラスが変更されることがあります。したがって、他のバージョンを使用している場合は、Hibernateの設定を変更する必要があるかもしれません。ただし、すべての4.x.xリリースに対して正常に動作することは確かです。Hibernate 4ではJBossログが使用されますが、古いバージョンではログ出力の目的でslf4jが使用されますので、プロジェクトにslf4j-simpleアーティファクトを含めています。これはHibernate 4を使用しているため不要ですが、含めています。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;
}
}
Employeeクラスは単純な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がJPA実装を提供しているため、エンティティBeanとしてクラスをマークするために使用されます。javax.persistence.Table
アノテーションは、テーブルマッピングと列の一意制約を定義するために使用されます。javax.persistence.Id
アノテーションは、テーブルの主キーを定義するために使用されます。javax.persistence.GeneratedValue
は、フィールドが自動生成されることを定義し、GenerationType.IDENTITY戦略が使用されるため、生成された”id”値がBeanにマップされ、Javaプログラムで取得できます。javax.persistence.Column
は、フィールドをテーブル列にマップするために使用されます。また、Beanプロパティの長さ、nullable、および一意性を指定することもできます。
Hibernate マッピング XML 設定
上記のように、Employee クラスのマッピングには XML ベースの設定を使用します。任意の名前を選択できますが、わかりやすさのためにテーブル名または Java ビーン名を選択することが良いです。Employee ビーン用の 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 構成はシンプルで、注釈ベースの構成と同じことを行います。
Hibernate 設定ファイル
XML ベースの構成と注釈ベースの構成の両方の 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 マッピングファイルの設定に注意してください。複数の 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">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 ベースの構成と同じですが、唯一の違いはマッピングの構成です。クラスおよびパッケージのマッピング構成を提供できます。
Hibernate SessionFactory
I have created a utility class where I am creating SessionFactory
from XML based configuration as well as property based configuration. For property based configuration, we could have a property file and read it in the class, but for simplicity I am creating Properties instance in the class itself.
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ベースの設定
private static SessionFactory sessionFactory;
//注釈ベースの設定
private static SessionFactory sessionAnnotationFactory;
//プロパティベースの設定
private static SessionFactory sessionJavaConfigFactory;
private static SessionFactory buildSessionFactory() {
try {
// hibernate.cfg.xmlからSessionFactoryを作成
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) {
//例外をログに記録することを確認します、それは無視されるかもしれません
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
private static SessionFactory buildSessionAnnotationFactory() {
try {
// hibernate.cfg.xmlからSessionFactoryを作成
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) {
//例外をログに記録することを確認します、それは無視されるかもしれません
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
private static SessionFactory buildSessionJavaConfigFactory() {
try {
Configuration configuration = new Configuration();
//プロパティを作成し、プロパティファイルから読み取ることもできます
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);
//マッピングファイルまたは注釈付きのクラスを設定できます
//addClass(Employee1.class)は、リソースを検索します
// com/journaldev/hibernate/model/Employee1.hbm.xml (良くない)
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
の作成は、マッピングがXMLベースか注釈ベースかに関係なく同じです。プロパティベースの場合、Configuration
オブジェクトにプロパティを設定し、SessionFactory
を作成する前に注釈クラスを追加する必要があります。全体として、SessionFactoryの作成には以下の手順が含まれます:
Configuration
オブジェクトを作成して構成しますServiceRegistry
オブジェクトを作成し、構成設定を適用します。configuration.buildSessionFactory()
を使用して、ServiceRegistry
オブジェクトを引数としてSessionFactory
オブジェクトを取得します。
私たちのアプリケーションはほぼ完成しました。テストプログラムを書いて実行しましょう。
Hibernate 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());
//セッションを取得する
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
//トランザクションを開始する
session.beginTransaction();
//モデルオブジェクトを保存する
session.save(emp);
//トランザクションをコミットする
session.getTransaction().commit();
System.out.println("Employee ID="+emp.getId());
//セッションファクトリを終了する。そうしないとプログラムが終了しません
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が印刷されていることに注意してください。データベーステーブルを確認できます。
Hibernate注釈構成テスト
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());
//セッションを取得する
SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
Session session = sessionFactory.getCurrentSession();
//トランザクションを開始する
session.beginTransaction();
//モデルオブジェクトを保存する
session.save(emp);
//トランザクションをコミットする
session.getTransaction().commit();
System.out.println("Employee ID="+emp.getId());
//セッションファクトリを終了する。そうしないとプログラムが終了しません
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に設定されます。
Hibernateの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());
//セッションを取得
SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
Session session = sessionFactory.getCurrentSession();
//トランザクションを開始
session.beginTransaction();
//モデルオブジェクトを保存
session.save(emp);
//トランザクションをコミット
session.getTransaction().commit();
System.out.println("Employee ID="+emp.getId());
//セッションファクトリを終了する(終了しないとプログラムが終了しません)
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フレームワークのさまざまな機能について詳しく説明します。以下のリンクから完全なプロジェクトをダウンロードして、さらに学習してみてください。
Source:
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginners