拦截器
import  java.io.Serializable;
import  java.util.HashSet;
import  java.util.Iterator;
import  java.util.Set;

import  org.hibernate.CallbackException;
import  org.hibernate.EntityMode;
import  org.hibernate.Interceptor;
import  org.hibernate.Transaction;
import  org.hibernate.type.Type;

public   class  TestInterceptor  implements  Interceptor,Serializable{

     
private  Set inserts  =   new  HashSet();
     
private  Set updates  =   new  HashSet();
    
     
// Session初化一个持久对象 如果这方法中改变了对象属性就返回true 否则null 
     public   boolean  onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)  throws  CallbackException {
         
return   false ;
    }

    
// Session flush()中检查到脏数据是调用 如:tr.commit() 
     public   boolean  onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types)  throws  CallbackException {
        updates.add(entity);
         
return   false ;
    }

    
// Session Save() 当修改了对象属性返回true 
     public   boolean  onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)  throws  CallbackException {
        
        inserts.add(entity);
         
return   false ;
    }

     
// delete 
     public   void  onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)  throws  CallbackException 
    }

     
//flush() 之前调用 
     public   void  preFlush(Iterator entities)  throws  CallbackException 
    }

     
// flush() 执行SQL语句之后调用 
     public   void  postFlush(Iterator entities)  throws  CallbackException {
        
         
try  {
             
for (Iterator it  =  updates.iterator();it.hasNext();){
                System.out.println( 
" update= " +  it.next() );    
            }

             
for (Iterator it  =  inserts.iterator();it.hasNext();){
                System.out.println( 
" insert " +  it.next() );    
            }

            
        }
  catch  (Exception e) {
            e.printStackTrace();
        }

        
    }


     
public  Boolean isTransient(Object entity) {
         
//  TODO Auto-generated method stub 
         return   null ;
    }

    
//决定Session中那些对象是脏数据 如果null Session使用默认处理脏数据 
     public   int [] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) 
         
return   null ;
    }


     
// 当Session构造实体类对象前调用 
     public  Object instantiate(String entityName, EntityMode entityMode, Serializable id)  throws  CallbackException 
         
return   null ;
    }


     
public  String getEntityName(Object object)  throws  CallbackException {
         
//  TODO Auto-generated method stub 
         return   null ;
    }


     
public  Object getEntity(String entityName, Serializable id)  throws  CallbackException {
         
//  TODO Auto-generated method stub 
         return   null ;
    }


     
public   void  afterTransactionBegin(Transaction tx) {
         
//  TODO Auto-generated method stub 
        
    }


     
public   void  beforeTransactionCompletion(Transaction tx) {
         
//  TODO Auto-generated method stub 
        
    }


     
public   void  afterTransactionCompletion(Transaction tx) {
         
//  TODO Auto-generated method stub 
        
    }


}


测试

import  java.lang.reflect.Field;

import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;

import  hbn.HibernateSessionFactory;
import  hbn.bean.T2oo;
import  junit.framework.TestCase;

public   class  TestIC  extends  TestCase {
     
private  SessionFactory sessionFactory;
     
protected   void  setUp()  throws  Exception {
         
super .setUp();
         
// 利用java反射得到 HibernateSessionFactory ->
         
// private  static org.hibernate.SessionFactory sessionFactory;
         
// 要模拟 并发 要 HibernateSessionFactory 得出的 有 threadLocal 不行  
        HibernateSessionFactory.currentSession();
        HibernateSessionFactory.closeSession();
        Field field  
=  HibernateSessionFactory. class .getDeclaredField( " sessionFactory " );
        field.setAccessible( 
true );
        sessionFactory  
=  (SessionFactory) field.get(HibernateSessionFactory. class );
    }

    
     
public   void  testInc()  throws  Exception {
        TestInterceptor intx  
=   new  TestInterceptor();
         
// 加载拦截器 
        Session session  =  sessionFactory.openSession(intx);
        
        Transaction tr  
=  session.beginTransaction();
        T2oo t2  
=   new  T2oo( 23 );
        session.save(t2);
        t2.setAvg( 
new  Integer( 99 ));
        tr.commit();
    }

}


结果
Hibernate: insert into t2oo (version, avg, aid, id) values (?, ?, ?, ?)
Hibernate: update t2oo set version=?, avg=?, aid=? where id=? and version=?
//拦截到的
update=hbn.bean.T2oo@277
inserthbn.bean.T2oo@277