Java >> Java チュートリアル >  >> Tag >> hibernate

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


Java タグ