Hibernate インターセプターの例
この例では、Hibernate Interceptor の使用方法を見ていきます。 Hinnernate トランザクション中、オブジェクトはいくつかのフェーズを通過する可能性があります。作成、更新、永続化、または削除です。 Interceptor
CRUD 操作など、データベース内の最も基本的なイベントを検出します。各イベントで、コールバック メソッドを起動します。この機能には数多くの用途がありますが、ご想像のとおり、最も基本的な用途の 1 つはロギングです。
Interceptor
を使用できます 発生したイベントのリストをログに記録します。問題は、必要なロギング方法やフレームワークを使用できるため、プログラムを簡単に拡張できることです。または、ロギング フレームワークやクライアント マシンのファイル システムを使用せずに、イベントをデータベース テーブルに記録することもできます。これにより、移植性が向上します。
o これらは、Windows 7 プラットフォームで使用するツールです:
- JDK 1.7
- Maven 3.0.5
- Hibernate 4.2.3.Final
- MySQL JDBC ドライバー 5.1.9
- Eclipse 4.3 ケプラー
このチュートリアルの基礎は、この Eclipse プロジェクトである HibernateMySQLExample.zip になります。また、Hibernate 3 と Maven 2 および MySQL 5 の例 (XML マッピングと注釈) に基づいています。
1. EmptyInterceptor クラスを作成する
使用するプロジェクトの構造は次のとおりです:
Interceptor
を使用するには Session
で 、 EmptyInterceptor.
を拡張するクラスを作成する必要があります . com.javacodegeeks.enterprise.hibernate package
に移動します Package Explorer で MyInterceptor
という名前の新しいクラスを作成します。 .次のコードを貼り付けます:
MyInterceptor.java:
package com.javacodegeeks.enterprise.hibernate; import java.io.Serializable; import java.util.Iterator; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; public class MyInterceptor extends EmptyInterceptor { private static final long serialVersionUID = 1L; public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // log delete events System.out.println("Delete event"); } // called when a Student gets updated. public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { if ( entity instanceof Student ) { System.out.println("Student Update Operation"); return true; } return false; } // called on load events public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // log loading events System.out.println("Load Operation"); return true; } public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if ( entity instanceof Student ) { System.out.println("Student Create Operation"); return true; } return false; } //called before commit into database public void preFlush(Iterator iterator) { System.out.println("Before commiting"); } //called after committed into database public void postFlush(Iterator iterator) { System.out.println("After commiting"); } }
これらは Interceptor
の最も基本的な方法です。 実装:
- オンセーブ :オブジェクトを保存するときに呼び出されます。オブジェクトはまだ永続化されていません。
- onFlushDirty :オブジェクトを更新するときに呼び出されます。オブジェクトはまだ永続化されていません。
- onDelete :オブジェクトを削除するときに呼び出されます。オブジェクトはまだデータベースから削除されていません。
- プレフラッシュ :データベースにコミットする前に呼び出されます。
- postFlush :データベースへのコミット後に呼び出されます。
HibernateUtil
も更新する必要があります クラス:
HibernateUtil.java:
package com.javacodegeeks.enterprise.hibernate.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import com.javacodegeeks.enterprise.hibernate.MyInterceptor; public class HibernateUtil { private static SessionFactory sessionFactory = buildSessionFactory(); private static ServiceRegistry serviceRegistry; private static SessionFactory buildSessionFactory() { Configuration configuration = new Configuration().setInterceptor(new MyInterceptor()); configuration.configure(); serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); return sessionFactory; } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); } }
App.java
を更新します Interceptor
をテストするためのファイル .
App.java:
package com.javacodegeeks.enterprise.hibernate; import org.hibernate.Query; import org.hibernate.Session; import com.javacodegeeks.enterprise.hibernate.utils.HibernateUtil; public class App { public static void main( String[] args ) { Session session = HibernateUtil.getSessionFactory().openSession(); //test insert System.out.println("*** Test insert ***"); session.beginTransaction(); Student student = new Student(); student.setStudentName("JavaFun"); student.setStudentAge("19"); session.saveOrUpdate(student); session.getTransaction().commit(); //test update System.out.println("*** Test Update ***"); session.beginTransaction(); Query query = session.createQuery("from Student where studentId = 59"); Student studentToUpdate = (Student)query.list().get(0); studentToUpdate.setStudentName("Lakis"); session.saveOrUpdate(studentToUpdate); session.getTransaction().commit(); //test delete System.out.println("*** Test Delete ***"); session.beginTransaction(); session.delete(studentToUpdate); session.getTransaction().commit(); } }
出力:
*** Test insert ***
Student Create Operation
Hibernate: insert into tutorials.student (STUDENT_NAME, STUDENT_Age) values (?, ?)
Before commiting
After commiting
*** Test Update ***
Before commiting
Hibernate: select student0_.STUDENT_ID as STUDENT1_0_, student0_.STUDENT_NAME as STUDENT2_0_, student0_.STUDENT_Age as STUDENT3_0_ from tutorials.student student0_ where student0_.STUDENT_ID=58
Load Operation
Before commiting
Student Update Operation
Hibernate: update tutorials.student set STUDENT_NAME=?, STUDENT_Age=? where STUDENT_ID=?
After commiting
*** Test Delete ***
Delete event
Before commiting
Hibernate: delete from tutorials.student where STUDENT_ID=?
After commiting
これは Hibernate Interceptor の例です。
このチュートリアルの Eclipse プロジェクトをダウンロードします:HibernateInterceptor.zip