hibernate チュートリアル
休止状態を開始する
サーチ…
備考
SessionFactory
Beanは、 TransactionManager
が作成を要求するすべてのデータベースセッションの作成、保守、終了、およびフラッシュを行います。だから私たちはSessionFactory
をDAOにautowireし、それを通してすべてのクエリを実行します。
新しいHibernateユーザーが尋ねる最大の問題の1つは、「いつ私の変更がコミットされるのですか?」です。その答えは、 TransactionManager
がSesisonFactory
とどのように連携するかを考えるときに意味があります。 @Transactional
で注釈を付けられたサービスメソッドを終了すると、データベースの変更はフラッシュされ、コミットされ@Transactional
。この理由は、トランザクションは、壊れていない作業の単一の「単位」を表すことになっているということです。ユニットに問題が発生した場合は、ユニットが故障したとみなされ、すべての変更がロールバックされます。したがって、 SessionFactory
は、元々呼び出されたサービスメソッドを終了するとセッションをフラッシュしてクリアします。
それは、トランザクションが進行中にセッションをフラッシュしてクリアしないと言っているわけではありません。たとえば、5つのオブジェクトのコレクションを追加し、データベース内のオブジェクトの総数を返すサービスメソッドを呼び出すと、 SessionFactory
はクエリ( SELECT COUNT(*)
)が更新された状態を正確に要求することを認識します。カウントクエリを実行する前に5つのオブジェクトの追加をフラッシュします。実行は次のようになります。
バージョン
バージョン | ドキュメントリンク | 発売日 |
---|---|---|
4.2.0 | http://hibernate.org/orm/documentation/4.2/ | 2013-03-01 |
4.3.0 | http://hibernate.org/orm/documentation/4.3/ | 2013-12-01 |
5.0.0 | http://hibernate.org/orm/documentation/5.0/ | 2015-09-01 |
XML構成を使用したHibernateのセットアップ
クラスパスのどこかにdatabase-servlet.xml
というファイルを作成します。
最初の設定ファイルは次のようになります:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>
tx
とjdbc
Spring名前空間がインポートされていることがtx
ます。これは、この設定ファイルでかなり頻繁に使用するためです。
まず、アノテーションベースのトランザクション管理( @Transactional
トランザクション)を有効にし@Transactional
。人々がSpringでHibernateを使用する主な理由は、Springがすべてのトランザクションを管理するためです。設定ファイルに次の行を追加します。
<tx:annotation-driven />
データソースを作成する必要があります。データソースは、基本的に、Hibernateがオブジェクトを永続化するために使用するデータベースです。一般に、1つのトランザクション・マネージャには1つのデータ・ソースがあります。 Hibernateが複数のデータソースと通信するようにするには、複数のトランザクションマネージャが必要です。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
このBeanのクラスは、 javax.sql.DataSource
を実装するものであれば何でもかまいません。このサンプルクラスはSpringによって提供されていますが、独自のスレッドプールを持ちません。一般的な代替案は、Apache Commons org.apache.commons.dbcp.BasicDataSource
、他にも多数あります。以下の各プロパティについて説明します。
driverClassName :JDBCドライバのパス。これはクラスパス上で利用できるデータベース固有の JARです。最新のバージョンを使用していることを確認してください。 Oracleデータベースを使用している場合は、OracleDriverが必要です。 MySQLデータベースをお持ちの場合は、MySQLDriverが必要です。あなたがここに必要なドライバを見つけることができるかどうかを確認しますが、クイックグーグルは正しいドライバを提供する必要があります。
url :データベースへのURL。通常、これは
jdbc\:oracle\:thin\:\path\to\your\database
またはjdbc:mysql://path/to/your/database
。あなたが使用しているデータベースのデフォルトの場所についてgoogleで検索した場合、これが何であるべきかを知ることができます。org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
というメッセージでHibernateException
した場合org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
、このガイドに従っているorg.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set
。あなたのURLが間違っている可能性が5%、データベースが起動しておらず、ユーザー名/パスワードが間違っている可能性が5%です。username :データベースで認証するときに使用するユーザー名。
パスワード :データベースで認証するときに使用するパスワード。
次に、 SessionFactory
を設定します。これは、トランザクションの作成と管理にHibernateが使用するもので、実際にはデータベースと通信します。以下に説明するいくつかの設定オプションがあります。
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="au.com.project />
<property name="hibernateProperties">
<props>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
dataSource :データソースBean。 dataSourceのIDを変更した場合は、ここで設定します。
packagesToScan :JPAアノテートされたオブジェクトを見つけるためにスキャンするパッケージ。これらは、セッションファクトリが管理する必要があるオブジェクトであり、一般的にはPOJOであり、
@Entity
で注釈が付けられ@Entity
。 Hibernateでオブジェクトリレーションシップを設定する方法の詳細については、こちらを参照してください 。annotatedClasses (図示せず):Hibernateが同じパッケージにすべて含まれていない場合、スキャンするクラスのリストを提供することもできます。
packagesToScan
またはannotatedClasses
いずれかを使用する必要がありpackagesToScan
が、両方を使用することはできません。宣言は次のようになります。
<property name="annotatedClasses">
<list>
<value>foo.bar.package.model.Person</value>
<value>foo.bar.package.model.Thing</value>
</list>
</property>
- hibernateProperties :ここには、これらのすべてが愛情を持って書かれています 。あなたが使用する主なものは以下の通りです:
- hibernate.hbm2ddl.auto :最もホットなHibernateの質問の1つは、このプロパティの詳細です。 詳細はこちらをご覧ください 。私は一般にvalidateを使い、SQLスクリプト(in-memory用)を使用してデータベースをセットアップするか、あらかじめデータベース(既存のデータベース)を作成します。
- hibernate.show_sql :ブールフラグ(trueの場合)Hibernateは、生成したすべてのSQLを
stdout
ます。log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
をログマネージャに設定することによって、クエリにバインドされている値を表示するようにロガーを設定することもできます(log4jを使用します)。 - hibernate.format_sql :ブールフラグ。HibernateはあなたのSQLをstdoutにきれいに印刷します。
- hibernate.dialect (正当な理由で示されていません):古いチュートリアルの多くは、データベースとの通信に使用するHibernateの方言を設定する方法を示しています。 Hibernate は 、使用しているJDBCドライバに基づいて、使用する方言を自動検出できます。約3つの異なるOracleの方言と5つの異なるMySQLの方言があるので、私はこの決定をHibernateに任せます。 Hibernateがサポートしている方言の完全なリストについては、 こちらを参照してください 。
宣言する必要がある最後の2つのBeanは次のとおりです。
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
id="PersistenceExceptionTranslator" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
PersistenceExceptionTranslator
は、データベース固有のHibernateException
またはSQLExceptions
を、アプリケーションコンテキストが理解できるSpring例外に変換します。
TransactionManager
Beanはトランザクションとロールバックを制御するものです。
注意: SessionFactory
BeanをDAOにオートワイヤリングする必要があります。
XMLレスのHibernate設定
package com.reborne.SmartHibernateConnector.utils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class LiveHibernateConnector implements IHibernateConnector {
private String DB_DRIVER_NAME = "";
private String DB_URL = "jdbc:h2:~/liveDB;MV_STORE=FALSE;MVCC=FALSE";
private String DB_USERNAME = "sa";
private String DB_PASSWORD = "";
private String DIALECT = "org.hibernate.dialect.H2Dialect";
private String HBM2DLL = "create";
private String SHOW_SQL = "true";
private static Configuration config;
private static SessionFactory sessionFactory;
private Session session;
private boolean CLOSE_AFTER_TRANSACTION = false;
public LiveHibernateConnector() {
config = new Configuration();
config.setProperty("hibernate.connector.driver_class", DB_DRIVER_NAME);
config.setProperty("hibernate.connection.url", DB_URL);
config.setProperty("hibernate.connection.username", DB_USERNAME);
config.setProperty("hibernate.connection.password", DB_PASSWORD);
config.setProperty("hibernate.dialect", DIALECT);
config.setProperty("hibernate.hbm2dll.auto", HBM2DLL);
config.setProperty("hibernate.show_sql", SHOW_SQL);
/*
* Config connection pools
*/
config.setProperty("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
config.setProperty("hibernate.c3p0.min_size", "5");
config.setProperty("hibernate.c3p0.max_size", "20");
config.setProperty("hibernate.c3p0.timeout", "300");
config.setProperty("hibernate.c3p0.max_statements", "50");
config.setProperty("hibernate.c3p0.idle_test_period", "3000");
/**
* Resource mapping
*/
// config.addAnnotatedClass(User.class);
// config.addAnnotatedClass(User.class);
// config.addAnnotatedClass(User.class);
sessionFactory = config.buildSessionFactory();
}
public HibWrapper openSession() throws HibernateException {
return new HibWrapper(getOrCreateSession(), CLOSE_AFTER_TRANSACTION);
}
public Session getOrCreateSession() throws HibernateException {
if (session == null) {
session = sessionFactory.openSession();
}
return session;
}
public void reconnect() throws HibernateException {
this.sessionFactory = config.buildSessionFactory();
}
}
最新のHibernateでは、この方法はうまくいきません(Hibernate 5.2リリースではこの設定が可能です)
XMLを使用した単純な休止状態の例
構成にXMLを使用して単純な休止状態のプロジェクトをセットアップするには、3つのファイル、hibernate.cfg.xml、各エンティティのPOJO、および各エンティティのEntityName.hbm.xmlが必要です。次にMySQLを使用した例を示します。
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/DBSchemaName
</property>
<property name="hibernate.connection.username">
testUserName
</property>
<property name="hibernate.connection.password">
testPassword
</property>
<!-- List of XML mapping files -->
<mapping resource="HibernatePractice/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
DBSchemaName、testUserName、およびtestPasswordはすべて置き換えられます。パッケージに含まれている場合は、必ずフルリソース名を使用してください。
Employee.java
package HibernatePractice;
public class Employee {
private int id;
private String firstName;
private String middleName;
private String lastName;
public Employee(){
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getMiddleName(){
return middleName;
}
public void setMiddleName(String middleName){
this.middleName = middleName;
}
public String getLastName(){
return lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
}
Employee.hbm.xml
<hibernate-mapping>
<class name="HibernatePractice.Employee" table="employee">
<meta attribute="class-description">
This class contains employee information.
</meta>
<id name="id" type="int" column="empolyee_id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="middleName" column="middle_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
</class>
</hibernate-mapping>
クラスがパッケージ内にある場合は、完全なクラス名packageName.classNameも使用します。
これら3つのファイルを作成したら、プロジェクトでhibernateを使用する準備が整いました。