RSS

数据拦截

11 Apr

拦截器(Interceptor)

1. org.hibernate.Interceptor接口定义了Hibernate中的通用拦截机制

2. 创建Session对象的时候,所有的Session对象或者这个Session对象的所有持久化操作的动作都会被指定的拦截器进行拦截

 

Interceptor接口的方法

afterTransactionBegin() 当一个事物启动时,会立刻调用这个方法,这个方法可以改变事物的状态,例如:回滚。

instantiate() 创建对象,如果返回null,则Hibernate将调用实体类的默认构造方法创建持久化对象

getEntity() 当一个持久化对象,通过标识符属性在Session的缓存中进行查找,并且没有找到时,会调用该方法

getEntityName() 当Session对象获取持久化对象名字时,会调用该方法

onLoad() 该方法在持久化对象初始化之前加载,这里的持久化对象刚被创建的状态(对象的属性值都未赋值)

findDirty() 当调用Session对象的flush()方法时,将调用该方法判断对象是否为脏数据,这是脏数据检查的另外拦截的实现方式

isTransient() 当调用Session对象的saveOrUpdate()方法时,会调用该方法判断对象是否尚未保存

onSave() 在对象被保存之前调用,通过这个方法可以对要保存的对象的属性进行修改

onDelete() 该方法在持久化对象被删除之前调用

preFlush() 该方法当调用Session对象的flush()方法之前被调用

onFlushDirty() 当调用Session对象flush()方法进行脏数据检查时,如果发现持久化对象的状态发生了改变,会调用该方法

postFlush() 该方法当调用Session对象的flush()方法之后被调用

beforeTransactionCompletion() 在完成一个事物之前,调用该方法,这个方法可以改变事务的状态,例如:回滚

afterTransactionCompletion() 当完成一个事物之后,立刻调用此方法

 

使用拦截器实现审计日志

1. 使用拦截器实现审计日志

2. 审计日志指的是,在应用系统中,对所有的数据库的操作都做记录,记录所操作内容、操作的用户和操作时间

LogEntityInterceptor.java

package hibernate.example.interceptor;

import java.io.Serializable;

import org.apache.log4j.Logger;

import org.hibernate.EmptyInterceptor;

import org.hibernate.type.Type;

@SuppressWarnings("serial")

public class LogEntityInterceptor extends EmptyInterceptor {

    private Logger log = Logger.getLogger(LogEntityInterceptor.class);

    //删除时调用

    public void onDelete(Object obj, Serializable serializable, Object state[], String propertyNames[], Type types[]){

        log.info("删除数据");

    }

   

    //修改数据保存前调用 – 通过拦截器对操作持久对象修改返回true,反之返回false;不建议通过拦截器对持久化对象状态进行修改,所以返回false

    public boolean onFlushDirty(Object entity, Serializable id, Object currentState[], Object preState[], String propertyNames[], Type types[]){

        log.info("修改数据");

        return false;

    }  

   

    //保存时调用

    public boolean onSave(Object entity, Serializable id, Object state[], String propertyNames[], Type types[]) {

        log.info("保存数据");

        return false;

    }

}

 

ExtendsEmptyInterceptorTest.java

package hibernate.example.test;

import java.util.Date;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import hibernate.example.interceptor.LogEntityInterceptor;

import hibernate.example.vo.GuestBook;

public class ExtendsEmptyInterceptorTest {

 

    public static void main(String[] args) {

        new ExtendsEmptyInterceptorTest().testInterceptor();

    }

   

    public void testInterceptor(){

        LogEntityInterceptor interceptor = new LogEntityInterceptor();

        //对SessionFactory生成的所有的session对象加载拦截器

        Configuration config = new Configuration();

        config.setInterceptor(interceptor);

        config.configure();

        SessionFactory sf = config.buildSessionFactory();

//      也可以对于指定的session加载特定的拦截器

//      Session session = sf.openSession(interceptor);

        Session session = sf.getCurrentSession();

       

        GuestBook gb = new GuestBook();

        gb.setName("Xavier");

        gb.setPhone("114");

        gb.setEmail("finchan_ding@hotmail.com");

        gb.setCreatedTime(new Date());

        gb.setTitle("Lektion 1");

        gb.setContent("Das is Utta");

       

        session.beginTransaction();

        session.save(gb);

        session.getTransaction().commit();

       

        session = sf.getCurrentSession();

        gb.setName("Nate");

        gb.setEmail("finchanding@gmail.com");

        session.beginTransaction();

        session.update(gb);

        session.getTransaction().commit();

       

        session = sf.getCurrentSession();

        session.beginTransaction();

        session.delete(gb);

        session.getTransaction().commit();

    }

}

Advertisements
 
Leave a comment

Posted by on 04/11/2011 in HIBERNATE

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

 
%d bloggers like this: