当前位置:K88软件开发文章中心编程语言SQLHibernate → 文章内容

Hibernate 拦截器

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-18 8:34:30

由 北公爵无欢 创建, 最后一次修改 2016-08-12 拦截器你已经学到,在 Hibernate 中,一个对象将被创建和保持。一旦对象已经被修改,它必须被保存到数据库里。这个过程持续直到下一次对象被需要,它将被从持久的存储中加载。 因此一个对象通过它生命周期中的不同阶段,并且 Interceptor 接口提供了在不同阶段能被调用来进行一些所需要的任务的方法。这些方法是从会话到应用程序的回调函数,允许应用程序检查或操作一个持续对象的属性,在它被保存,更新,删除或上传之前。以下是在 Interceptor 接口中可用的所有方法的列表。 S.N.方法和描述1findDirty()这个方法在当 flush() 方法在一个 Session 对象上被调用时被调用。2instantiate()这个方法在一个持续的类被实例化时被调用。3isUnsaved()这个方法在当一个对象被传到 saveOrUpdate() 方法时被调用。4onDelete()这个方法在一个对象被删除前被调用。5onFlushDirty()这个方法在当 Hibernate 探测到一个对象在一次 flush(例如,更新操作)中是脏的(例如,被修改)时被调用。6onLoad()这个方法在一个对象被初始化之前被调用。7onSave()这个方法在一个对象被保存前被调用。8postFlush()这个方法在一次 flush 已经发生并且一个对象已经在内存中被更新后被调用。9preFlush()这个方法在一次 flush 前被调用。Hibernate 拦截器给予了我们一个对象如何应用到应用程序和数据库的总控制。 如何使用拦截器?为了创建一个拦截器你可以直接实现 Interceptor 类或者继承 EmptyInterceptor 类。以下是简单的使用 Hibernate 拦截器功能的步骤。 创建拦截器我们将在例子中继承 EmptyInterceptor,当 Employee 对象被创建和更新时拦截器的方法将自动被调用。你可以根据你的需求实现更多的方法。 import java.io.Serializable;import java.util.Date;import java.util.Iterator;import org.hibernate.EmptyInterceptor;import org.hibernate.Transaction;import org.hibernate.type.Type;public class MyInterceptor extends EmptyInterceptor { private int updates; private int creates; private int loads; public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // do nothing } // This method is called when Employee object gets updated. public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { if ( entity instanceof Employee ) { System.out.println("Update Operation"); return true; } return false; } public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // do nothing return true; } // This method is called when Employee object gets created. public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if ( entity instanceof Employee ) { System.out.println("Create Operation"); return true; } return false; } //called before commit into database public void preFlush(Iterator iterator) { System.out.println("preFlush"); } //called after committed into database public void postFlush(Iterator iterator) { System.out.println("postFlush"); }}创建 POJO 类现在让我们稍微修改我们的第一个例子,我们使用 EMPLOYEE 表单和 Employee 类: public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; }}创建数据库表第二步将是在你的数据库中创建表。一张表对应每个你提供持久性的对象。考虑以上的对象需要被存储和检索到以下的 RDBM 表中: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id));创建 Mapping 配置文件这个步骤是来创建一个指导 Hibernate 如何将定义的类或者多个类映射到数据库表单中的映射文件。 <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <gen

[1] [2] [3]  下一页


Hibernate 拦截器