hibernate如何使用拦截器?hibernate菜鸟教程之使用拦截器

Hibernate是一个开源,轻量级的ORM工,它简化了java应用程序与数据库交互的开发,因此在开发项目的时候得到了重用,那hibernate如何使用拦截器?接下来我们就来给大家讲解一下这方面的内容。

hibernate菜鸟教程.png

创建拦截器

我们将在例子中继承 EmptyInterceptor,当 Employee 对象被创建和更新时拦截器的方法将自动被调用。你可以根据你的需求实现更多的方法。

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">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
</hibernate-mapping>

创建 Application 类

最后,我们将用 main() 创建 application 类来运行应用程序。这里应该注意当创建 session 对象时我们使用 Interceptor 类作为参数。

import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee
{
    private static SessionFactory factory;
    public static void main(String[] args)
    {
        try
        {
            factory = new Configuration()
                .configure()
                .buildSessionFactory();
        }
        catch (Throwable ex)
        {
            System.err.println("Failed to create sessionFactory object." + ex);
            throw new ExceptionInInitializerError(ex);
        }
        ManageEmployee ME = new ManageEmployee();
        /* Add few employee records in database */
        Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
        Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
        Integer empID3 = ME.addEmployee("John", "Paul", 10000);
        /* List down all the employees */
        ME.listEmployees();
        /* Update employee's records */
        ME.updateEmployee(empID1, 5000);
        /* Delete an employee from the database */
        ME.deleteEmployee(empID2);
        /* List down new list of the employees */
        ME.listEmployees();
    }
    /* Method to CREATE an employee in the database */
    public Integer addEmployee(String fname, String lname, int salary)
    {
        Session session = factory.openSession(new MyInterceptor());
        Transaction tx = null;
        Integer employeeID = null;
        try
        {
            tx = session.beginTransaction();
            Employee employee = new Employee(fname, lname, salary);
            employeeID = (Integer) session.save(employee);
            tx.commit();
        }
        catch (HibernateException e)
        {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        }
        finally
        {
            session.close();
        }
        return employeeID;
    }
    /* Method to  READ all the employees */
    public void listEmployees()
    {
        Session session = factory.openSession(new MyInterceptor());
        Transaction tx = null;
        try
        {
            tx = session.beginTransaction();
            List employees = session.createQuery("FROM Employee")
                .list();
            for (Iterator iterator =
                employees.iterator(); iterator.hasNext();)
            {
                Employee employee = (Employee) iterator.next();
                System.out.print("First Name: " + employee.getFirstName());
                System.out.print("  Last Name: " + employee.getLastName());
                System.out.println("  Salary: " + employee.getSalary());
            }
            tx.commit();
        }
        catch (HibernateException e)
        {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }
    /* Method to UPDATE salary for an employee */
    public void updateEmployee(Integer EmployeeID, int salary)
    {
        Session session = factory.openSession(new MyInterceptor());
        Transaction tx = null;
        try
        {
            tx = session.beginTransaction();
            Employee employee =
                (Employee) session.get(Employee.class, EmployeeID);
            employee.setSalary(salary);
            session.update(employee);
            tx.commit();
        }
        catch (HibernateException e)
        {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }
    /* Method to DELETE an employee from the records */
    public void deleteEmployee(Integer EmployeeID)
    {
        Session session = factory.openSession(new MyInterceptor());
        Transaction tx = null;
        try
        {
            tx = session.beginTransaction();
            Employee employee =
                (Employee) session.get(Employee.class, EmployeeID);
            session.delete(employee);
            tx.commit();
        }
        catch (HibernateException e)
        {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }
}

编译和执行

这里是编译和运行上面提及的应用程序的步骤。确保你已经在处理编译和执行前正确设置了 PATH 和 CLASSPATH。

创建在 configuration 章节中解释的 hibernate.cfg.xml 配置文件。

创建如上所示的 Employee.hbm.xml 映射文件。

创建如上所示的 Employee.java 源文件并编译。

创建如上所示的 MyInterceptor.java 源文件并编译。

创建如上所示的 ManageEmployee.java 源文件并编译。

执行 ManageEmployee 来运行程序。

你将得到以下结果,而且记录将在 EMPLOYEE 表单中被创建。

$java ManageEmployee
    .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush
preFlush
Update Operation
postFlush
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush

如果你检查你的 EMPLOYEE 表单,它应该有如下结果:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>

这样就完成了Hibernate 拦截器的创建以及使用,Hibernate 拦截器给予了我们一个对象如何应用到应用程序和数据库的总控制。可见Hibernate 拦截器的重要性!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。

推荐阅读:

java初学者如何入门?java初学者入门技巧

java语言属于哪种语言?java语言有哪些特点?

hibernate缓存机制有几种?hibernate缓存范围有哪些?