posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

hbn 拦截器

Posted on 2007-11-29 10:13 G_G 阅读(1019) 评论(0)  编辑  收藏 所属分类: hibernate
拦截器
package  hbn.test.supper.Interceptor;

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
        
    }

}

测试

package  hbn.test.supper.Interceptor;

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




只有注册用户登录后才能发表评论。


网站导航: