Hibernate学习---第十三节:hibernate过滤器和拦截器的实现

一、hibernate 过滤器

1、在持久化映射文件中配置过滤器,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
    <!-- 定义过滤器,并指定参数 -->
    <filter-def name="password_filter">
        <filter-param name="ps" type="integer"/>
        <filter-param name="ps2" type="integer"/>
    </filter-def>
    
    <class name="Person" table="t_person">
        <id name="id" column="person_id">
            <generator class="native"/>
        </id>
        <property name="name" column="t_name"/>
        <property name="age"/>    
        <property name="passwork"/>
        <property name="birthday"/>
        <filter name="password_filter" condition="password between :ps and :ps2"/>
    </class>
</hibernate-mapping>

2、测试过滤器:

@Test
public void testQuery(){
    // 启用指定名称对应的过滤器
    Filter filter = session.enableFilter("password_filter");
    // 过滤器参数绑定(过滤条件的绑定)
    filter.setParameter("ps", 123458);
    filter.setParameter("ps2", 123464);
    Query query = session.createQuery("from Person");
    List<Person> list = query.list();
    for(Person p : list){
        System.out.println(p);
    }
    
    System.out.println("--------------------------");
    // 停用指定的过滤器
    // 如果在一个有开启开启过滤器的 session 中进行对应的持久化类的查询操作都会自动加上过滤条件
    // session.disableFilter("password_filter");
    Query query2 = session.createQuery("from Person where id in (:ids)");
    query2.setParameter("ids", new Object[]{4,5});
    List<Person> list2 = query2.list();
    for(Person p : list2){
        System.out.println(p);
    }
    
    System.out.println("--------------------------");
    // 通过以下实验证明过滤器只是加在 create* 方法上
    session.clear();
    Person person = (Person)session.get(Person.class, 6);
    System.out.println(person);
}

二、hibernate 拦截器

1、写一个继承 EmptyInterceptor 类实现相关的方法,代码如下:

package learn.hibernate.interceptor;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;

import learn.hibernate.bean.Person;

import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;

/**
 * 自定义拦截器
 * 在执行某个动作之前或之后加一个自己的业务操作
 * @author Administrator
 *
 */
public class MyInterceptor extends EmptyInterceptor{

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        System.out.println("-------------拦截保存-------------");
        System.out.println("entity:"+entity);
        System.out.println("id:"+id);
        System.out.println("state:"+Arrays.toString(state));
        System.out.println("propertyNames:"+Arrays.toString(propertyNames));
        System.out.println("types:"+Arrays.toString(types));
        
        if(entity.getClass() == Person.class){
            for(int i = 0, len = propertyNames.length; i < len; i++){
                if(propertyNames[i].equals("birthday")){
                    if(state[i]==null){
                        Person p = (Person) entity;
                        p.setBirthday(new Date());
                    }
                }
            }
        }
        
        return super.onSave(entity, id, state, propertyNames, types);
    }
}

以上的类实现了 EmptyInterceptor 类的 onSave() 方法,也就是说在保存数据的时候调用该方法可做相关的拦截

2、测试类代码如下:

/**
 * 批量写入数据
 */
@Test
public void testAdd(){
    // 开启拦截器(局部拦截器)
    session = factory.withOptions().interceptor(new MyInterceptor()).openSession();
    tx = session.beginTransaction();
    
    Person person = new Person("admin", 22, 123456, null);
    session.persist(person);
    
    tx.commit();
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。