Hibernate入門(2):基本使用
12159 ワード
Hibernate基本使用
アプリケーションでHibernateフレームワークを使用するには、次の手順に従います.
1)Hibernate関連依存ライブラリをプロジェクトにインポートする(詳細はhttp://blog.csdn.net/al_assad/article/details/77887263
);
2)POJO(永続化エンティティ)クラスを作成し、データベース内のテーブルに対してエンティティとしてマッピングする.
3)プロファイルの作成(
hibernate.cfg.xml
)、データベース接続パラメータを構成し、データベースエンジンなどの構成を選択する.
4)永続オブジェクトを取得または格納するクラス(実際にPOJOを用いた論理クラス)を作成する.
※その中でもPOJOの配置については注記を使用して配置することを推奨し、当然このPOJO独自のxml配置を使用して配置することも可能であるが、この方法はプロジェクトのメンテナンス性を低下させるので、POJOで直接注釈配置を行うことを推奨する.
単純な例
以下では、簡単な例について説明します.
この例で使用するhibernateバージョンは5.2です.
使用するデータベースはMySQL 5.5です.
データベース名「ioganes」、その中の「users」データテーブルを例に、構造は以下の通りです.
Hibernateの下位層はJDBCでデータベースに接続するため、プロジェクト依存でmysql-connector-javaをインポートする.JAr、ダウンロードアドレス:https://dev.mysql.com/downloads/connector/j/
エンジニアリングの概略:
1)永続化エンティティクラスPOJO
demo.Users.java
永続化エンティティクラス(PO)クラス自体は、リレーショナル・データベース内のフォームのデータをクラス・オブジェクトとしてマッピングするための永続化JavaBean(POJO)であり、POJOでは対応する永続化注釈を使用して各永続化注釈を表示する.
新しいバージョンのhibernateでは、従来の永続化マッピングプロファイルの代わりに永続化注釈を使用することが提唱されており、コードの可読性を向上させることができます.
次に、上記の例で説明した寸法を示します.
@Entity:クラスがHibernate永続化エンティティ(PO)であることを宣言します.
@Table:クラスマッピングのテーブルを指定し、ここでusersテーブルにマッピングします.
@Id:クラスの識別属性を指定します.つまり、クラスの属性を一意に識別できます.通常、データテーブルのプライマリ・キー・フィールドにマッピングされます.
@GeneratedValue:プライマリ・キーの生成ポリシーを指定します.ここでstrategyプロパティは
IDENTITY、すなわち自動成長のプライマリ・キー生成ポリシーについては、このセクションを参照してください.
@Column:クラス属性がデータテーブルにマッピングされるフィールド名を指定します(デフォルトでは使用されません).
完全な永続化注記を参照してください.
http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html
2)プロファイル
hibernate.cfg.xml
hibernate.cfg.xmlプロファイルデータベース接続マッピングなどの情報を構成するプロファイルです.デフォルトはプロジェクトsrcディレクトリの下に配置され、デフォルトは「
hibernate.cfg.xml
「コンテキストオブジェクトの構築を実行すると、自動的にファイルが呼び出されます(もちろん明示的に呼び出すこともできます).プロジェクトに複数のデータベースが呼び出されている場合は、複数のマッピングプロファイルを使用して、コンテキストオブジェクトを構築するときに対応するファイルを明示的に呼び出すことができます.
以上のプロファイルは、従来のDriverManagerの代わりにHibernateが推奨するc 3 p 0データソースを使用してデータベースに接続し、最高のデータベース接続性能を保証します.
詳細なデータベース・プロファイル・パラメータについては、次を参照してください.
http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database
3)操作類
demo.UserManager.java
-構造体系
上記のコードの最適化では、次のように、HibernateUtil専用の管理セッションを分割できます.
HibernateUtil.java
UserManager.java
オブジェクトの永続化操作
永続化オブジェクトのステータス
永続化されたオブジェクトPOを実際に使用するには、まずSessionオブジェクトを取得する必要があります.POJOは、Sessionの管理下でのみデータベースへのアクセスを完了できます.POとSessionの関連関係には、次の3つがあります.過渡:POインスタンスはセッションと関連付けられておらず、POインスタンスは過渡的である. 永続化:POインスタンスはセッションに関連付けられ、この例はデータベースレコードに対応し、インスタンスは永続化状態にある. 脱管状態:POインスタンスはSessionに関連付けられたことがあるが、Sessionが閉じたなどの理由でPOインスタンスはSessionの管理から離れ、このときこのインスタンスは脱管状態にある.
永続化オブジェクトの状態を変更する方法
①永続化エンティティ
過渡オブジェクトを永続化オブジェクトに変換し、セッションオブジェクトのsave()を使用します.
persist()メソッド;
②プライマリ・キーによる永続化エンティティのロード
Sessionのget()で、load()メソッドはプライマリ・キーに基づいてエンティティをロードできます.異なるのは、指定したプライマリ・キーのエンティティが存在しない場合、getはnullを返し、loadはHibernateExceptionを放出します.
③永続化エンティティの更新
④管理主体の更新
Session管理から離れたエンティティの場合、プログラムが管理オブジェクトの状態を変更した後、これらの変更を明示的に新しいSessionで保存する必要があり、Sessionオブジェクトのupdate()、merge()、updateOrSave()メソッドを使用して変更されたエンティティを保存することができる.
updateメソッドは、オブジェクトを直接永続化します.オブジェクトが実体化された場合はupdateを使用し、存在しない場合はsaveを使用し、不確定な場合はupdateOrSaveを使用します.
mergeメソッドはupdateとは異なり、オブジェクトを直接永続化するのではなく、オブジェクトにコピーし、そのコピーを永続化するが、元のオブジェクトは永続化せず、Sessionを再関連付けない.
⑤永続化エンティティの削除
Sessionのdeleteメソッドを使用して永続化エンティティを削除できます.永続化エンティティを削除すると、対応するデータテーブルレコードも削除されます.
取引アクション
Hibernateのトランザクション操作は、セッションオブジェクトのTransactionオブジェクトによって実現される.
トランザクションのコミット
トランザクションのロールバック
Transactionの使用方法の詳細については、タイムアウトの設定、transactionステータスの取得など、次の項目を参照してください.http://docs.jboss.org/hibernate/orm/5.2/javadocs/
アプリケーションでHibernateフレームワークを使用するには、次の手順に従います.
1)Hibernate関連依存ライブラリをプロジェクトにインポートする(詳細はhttp://blog.csdn.net/al_assad/article/details/77887263
);
2)POJO(永続化エンティティ)クラスを作成し、データベース内のテーブルに対してエンティティとしてマッピングする.
3)プロファイルの作成(
hibernate.cfg.xml
)、データベース接続パラメータを構成し、データベースエンジンなどの構成を選択する.
4)永続オブジェクトを取得または格納するクラス(実際にPOJOを用いた論理クラス)を作成する.
※その中でもPOJOの配置については注記を使用して配置することを推奨し、当然このPOJO独自のxml配置を使用して配置することも可能であるが、この方法はプロジェクトのメンテナンス性を低下させるので、POJOで直接注釈配置を行うことを推奨する.
単純な例
以下では、簡単な例について説明します.
この例で使用するhibernateバージョンは5.2です.
使用するデータベースはMySQL 5.5です.
データベース名「ioganes」、その中の「users」データテーブルを例に、構造は以下の通りです.
Hibernateの下位層はJDBCでデータベースに接続するため、プロジェクト依存でmysql-connector-javaをインポートする.JAr、ダウンロードアドレス:https://dev.mysql.com/downloads/connector/j/
エンジニアリングの概略:
1)永続化エンティティクラスPOJO
demo.Users.java
package demo;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name="users")
public class Users {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="user_id")
private int id;
@Column(name="user_name")
private String name;
@Column(name="user_password")
private String password;
@Column(name="create_date")
@Temporal(TemporalType.DATE)
private Date createDate;
@Column(name="user_icon")
private String icon;
// get、set
}
永続化エンティティクラス(PO)クラス自体は、リレーショナル・データベース内のフォームのデータをクラス・オブジェクトとしてマッピングするための永続化JavaBean(POJO)であり、POJOでは対応する永続化注釈を使用して各永続化注釈を表示する.
新しいバージョンのhibernateでは、従来の永続化マッピングプロファイルの代わりに永続化注釈を使用することが提唱されており、コードの可読性を向上させることができます.
次に、上記の例で説明した寸法を示します.
@Entity:クラスがHibernate永続化エンティティ(PO)であることを宣言します.
@Table:クラスマッピングのテーブルを指定し、ここでusersテーブルにマッピングします.
@Id:クラスの識別属性を指定します.つまり、クラスの属性を一意に識別できます.通常、データテーブルのプライマリ・キー・フィールドにマッピングされます.
@GeneratedValue:プライマリ・キーの生成ポリシーを指定します.ここでstrategyプロパティは
IDENTITY、すなわち自動成長のプライマリ・キー生成ポリシーについては、このセクションを参照してください.
@Column:クラス属性がデータテーブルにマッピングされるフィールド名を指定します(デフォルトでは使用されません).
完全な永続化注記を参照してください.
http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html
2)プロファイル
hibernate.cfg.xml
com.mysql.jdbc.Driver
jdbc:mysql://localhost/iogames
root
mysql1994assad
20
1
5000
100
3000
2
true
org.hibernate.dialect.MySQL55Dialect
update
true
true
hibernate.cfg.xmlプロファイルデータベース接続マッピングなどの情報を構成するプロファイルです.デフォルトはプロジェクトsrcディレクトリの下に配置され、デフォルトは「
hibernate.cfg.xml
「コンテキストオブジェクトの構築を実行すると、自動的にファイルが呼び出されます(もちろん明示的に呼び出すこともできます).プロジェクトに複数のデータベースが呼び出されている場合は、複数のマッピングプロファイルを使用して、コンテキストオブジェクトを構築するときに対応するファイルを明示的に呼び出すことができます.
以上のプロファイルは、従来のDriverManagerの代わりにHibernateが推奨するc 3 p 0データソースを使用してデータベースに接続し、最高のデータベース接続性能を保証します.
詳細なデータベース・プロファイル・パラメータについては、次を参照してください.
http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database
3)操作類
demo.UserManager.java
package demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import java.util.Date;
public class UserManager {
public static void main(String[] args){
//
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
// SessionFactory
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
try{
// Session
Session session = sessionFactory.openSession();
//
Transaction tran = session.beginTransaction();
// Users , CRDU
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
user.setCreateDate(new Date());
user.setIcon("1");
// User,
session.save(user);
tran.commit();
// Session、 SessionFactory
session.close();
sessionFactory.close();
}catch(Exception ex){
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
では、Sessionfactory、Session、Transactionなどの主要なデータベース操作オブジェクトの説明については、次を参照してください.http://blog.csdn.net/al_assad/article/details/77887263 -構造体系
上記のコードの最適化では、次のように、HibernateUtil専用の管理セッションを分割できます.
HibernateUtil.java
import org.hibernate.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;
import org.hibernate.cfg.*;
public class HibernateUtil{
public static SessionFactory sessionFactory;
static{
try{
//
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
// SessionFactory
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
}catch (Throwable ex){
throw new ExceptionInInitializerError(ex);
}
}
// ThreadLocal ,
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException{
Session s = session.get();
// Session, Session
if (s == null){
s = sessionFactory.openSession();
// Session ThreadLocal session
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException{
Session s = session.get();
if (s != null)
s.close();
session.set(null);
}
}
UserManager.java
public class UserManager {
public static void main(String[] args){
// Session
Session session = HibernateUitl.currentSession();
//
Transaction tran = session.beginTransaction();
// Users , CRDU
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
user.setCreateDate(new Date());
user.setIcon("1");
// User,
session.save(user);
tran.commit();
// Session
SessionUtil.closeSession();
}
}
オブジェクトの永続化操作
永続化オブジェクトのステータス
永続化されたオブジェクトPOを実際に使用するには、まずSessionオブジェクトを取得する必要があります.POJOは、Sessionの管理下でのみデータベースへのアクセスを完了できます.POとSessionの関連関係には、次の3つがあります.
永続化オブジェクトの状態を変更する方法
①永続化エンティティ
過渡オブジェクトを永続化オブジェクトに変換し、セッションオブジェクトのsave()を使用します.
persist()メソッド;
Users user = new User();
user.setName("assad");
session.save(user);
②プライマリ・キーによる永続化エンティティのロード
Sessionのget()で、load()メソッドはプライマリ・キーに基づいてエンティティをロードできます.異なるのは、指定したプライマリ・キーのエンティティが存在しない場合、getはnullを返し、loadはHibernateExceptionを放出します.
User user = session.get(User.class,"20140302");
③永続化エンティティの更新
User user = session.get(User.class,"20140302");
user.setName("assad");
session.flush();
④管理主体の更新
Session管理から離れたエンティティの場合、プログラムが管理オブジェクトの状態を変更した後、これらの変更を明示的に新しいSessionで保存する必要があり、Sessionオブジェクトのupdate()、merge()、updateOrSave()メソッドを使用して変更されたエンティティを保存することができる.
updateメソッドは、オブジェクトを直接永続化します.オブジェクトが実体化された場合はupdateを使用し、存在しない場合はsaveを使用し、不確定な場合はupdateOrSaveを使用します.
mergeメソッドはupdateとは異なり、オブジェクトを直接永続化するのではなく、オブジェクトにコピーし、そのコピーを永続化するが、元のオブジェクトは永続化せず、Sessionを再関連付けない.
Session sess1 = sessionFactory.openSession();
User user = sess1.get(User.class,"20140302");
sess1.close();
user.setName("assad");
Session sess2 = sessionFactory.openSession();
sess2.update(user);
⑤永続化エンティティの削除
Sessionのdeleteメソッドを使用して永続化エンティティを削除できます.永続化エンティティを削除すると、対応するデータテーブルレコードも削除されます.
User user = session.get(User.class,"20140302");
session.delete(user);
取引アクション
Hibernateのトランザクション操作は、セッションオブジェクトのTransactionオブジェクトによって実現される.
トランザクションのコミット
public static void main(String[] args){
Session session = HibernateUitl.currentSession();
Transaction tran = session.beginTransaction(); //
//CRUD
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
session.save(user);
tran.commit(); //
SessionUtil.closeSession();
}
トランザクションのロールバック
public static void main(String[] args){
Session session = HibernateUitl.currentSession();
Transaction tran = session.beginTransaction(); //
//CRUD
Users user = new Users();
user.setName("Al-assad");
user.setPassword("123");
if(flag) { //
tran.rollback(); //
}
session.save(user);
tran.commit(); //
SessionUtil.closeSession();
}
Transactionの使用方法の詳細については、タイムアウトの設定、transactionステータスの取得など、次の項目を参照してください.http://docs.jboss.org/hibernate/orm/5.2/javadocs/