Hibernate事件框架之拦截器

来源:互联网 发布:linux源码安装vsftpd 编辑:程序博客网 时间:2024/05/17 20:26
使用拦截器时按如下步骤进行:
(
1)定义实现Interceptor接口的拦截器类
(
2)通过Session启用拦截器,或者通过Configuration启用全局拦截器
请看示例代码(仅仅打印出标志代码):
public class MyInterceptor extends EmptyInterceptor
{
    
//更新的次数
    private int updates;
    
//插入的次数
    private int creates;
    
//当删除数据时,将调用onDelete方法
    public void onDelect(Object entity, Serializable id, Object[]
         state, String[] propertyNames, Type[] types)
    
{
        
//do nothing
    }

    
//同步Session和数据库中的数据
    public boolean onFlushDirty(Object entity, Serializable id,
        Object[] currentState, Object[] previousState,
        String[] propertyNames, Type[] types)
    
{
        
//每同步一次,修改的累加器加1
        yuuuuuuuuuuuuuuuuuuuuuuuuyuh++;
        
for (int i=0; i < propertyNames.length; i++)
        
{
            
if ("lastUpdateTimestamp".equals(propertyNames[i]))
            
{
                currentState[i] 
= new Date();
                
return true;
            }

        }

        
return false;
    }

    
//加载持久化实例时调用该方法
    public boolean onLoad(Object entity, Serializable id,
        Object[] state, String[] propertyNames, Type[] types)
    
{
        System.out.println(
"===============================");
        
for (int i=0; i < propertyNames.length; i++)
        
{
            
if ("name".equals(propertyNames[i]))
            
{
                System.out.println(state[i]);
                state[i] 
= "aaa";
                
return true;
            }

        }

        
return false;
    }

    
//保存持久化实例时,调用该方法
    public boolean onSave(Object entity, Serializable id,
        Object[] state, String[] propertyNames, Type[] types)
    
{
        creates
++;
        
for (int i=0; i < propertyNames.length; i++)
        
{
            
if ("createTimestamp".equals(propertyNames[i]))
            
{
                state[i] 
= new Date();
                
return true;
            }

        }

        
return false;
    }

    
//提交刷新
    public void postFlush(Iterator entities)
    
{
        System.out.println(
"创建的次数:" + creates + ",更新的次数:"
         
+ updates);
    }

    
public void preFlush(Iterator entities)
    
{
        updates 
= 0;
        creates 
= 0;
    }

    
//事务提交之前触发该方法
    public void beforeTransactionCompletion(Transaction tx)
    
{
        System.out.println(
"事务即将结束");
    }

    
//事务提交之后触发该方法
    public void afterTransactionCompletion(Transaction tx)
    
{
        System.out.println(
"事务已经结束");
    }

}

下面是使用局部拦截器的示例代码:
public class HibernateUtil
{
    
//静态类属性 SessionFactory
    public static final SessioFactory sessionFactory;
    
//静态初始化块,完成静态属性的初始化
    static
    
{
        
try
        
{
            
//采用默认的hibernate.cfg.xml来启动一个Cofiguration的实例
            Configuration configuration = new Cofiguration().configure();
            
//由Cofiguration的实例来创建一个SessionFactory实例
            sessionFactory = cofiguration.buildSessionFactory();
        }

        
catch (Throwable ex)
        
{
            System.err.println(
"初始化sessionFactory失败." + ex);
            
throw new ExceptionInInitializerError(ex);
        }

    }

    
//ThreadLocal是隔离多个线程的数据共享,不存在多个线程之间共享资源
    
//因此不再需要对线程同步
    public static Session currentSession() throws HibernateException
    
{
        Session s 
= (Session)session.get();
        
//如果该线程还没有Session,则创建一个新的Session
        if (s == null)
        
{
            s 
= sessionFactory.openSession();
            
//将获得的Session变量存储在ThreadLocal变量Session里
            session.set(s);
        }

        
return s;
    }

    
//加拦截器的打开Session方法
    public static Session currentSession(Interceptor it) throws HibernateException
    
{
        Session s 
= (Session)session.get();
        
if (s == null)
        
{
            
//以拦截器创建Session对象
            s = sessionFactory.openSession(it);
            
//将获得的Session变量存储在ThreadLocal变量Session里
            session.set(s);
        }

        
return s;
    }

    
public static void closeSession() throws HibernateException
    
{
        Session s 
= (Session)session.get();
        
if (s != null)
            s.close();
        
//这个不错。。
        session.set(null);
    }

}


下面是主程序使用拦截器的代码:
private void testUser()
{
    
//以拦截器开始Session
    Sessin session = HibernateUtil.currentSession(new MyInterceptor());
    
//开始事务
    Transaction tx = session.beginTransaction();
    
//执行下面代码时,可以看到系统回调onSave等方法
    /*
    User u = new User();
    u.setName("PROLOVE");
    u.setAge(20);
    u.setNataionality("中国");
    session.persist(u);
    
*/

    
//执行下面代码时,可以看到系统回调onLoad等方法
    Object o = session.load(User.classnew Integer(1));
    System.out.println(o);
    User u 
= (User)o;
    System.out.println(u.getName());
    
//提交事务时,可以看到系统回调事务相关方法
    tx.commit();
    HibernateUtil.closeSession();
}
 
原创粉丝点击