当前位置:编程学习 > JAVA >>

Hibernate读书笔记-----事件机制

   Hibernate执行持久化过程中,应用程序无法参与其中。所有的数据持久化操作,对用户都是透明的。
          通过事件框架,Hibernate允许应用程能响应特定的内部事件,从而允许实现某些通用的功能或者对Hibernate功能进行扩展。
 
          Hibernate的事件机制框架由两个部分组成:
             1、易做图机制:对于特定动作拦截,回调应用中的特定动作
             2、事件系统:重写Hibernate的事件易做图。
 
          一、易做图
          Interceptor接口提供了从会话回调应用程序的机制,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。
          通过Interceptor接口,可以在数据进入数据库之前,对数据进行最后的检查,如果数据不符合要求,可以修改数据,从而避免非法数据进入数据库。
 
          使用易做图按如下两个步骤进行:
          1、定义实现Interceptor接口的易做图
          2、通过Session启用易做图,或者通过Configuration启用全局易做图
          程序可以通过实现Interceptor接口来创建易做图,也可以通过继承EmptyInterceptor来实现易做图。
[java]
public class MyIterceptor extends EmptyInterceptor { 
    // 记录修改次数 
    private int updates; 
    // 记录创建次数 
    private int creates; 
 
    // 当删除实体时,onDelete方法将被调用 
    public void onDelete(Object entity, Serializable id, Object[] state, 
            String[] propertyNames, Type[] types) { 
        // do nothing 
    } 
 
    // 当把持久化实体的状态同步到数据库时,onFlushDirty方法被调用 
    public boolean onFlushDirty(Object entity, Serializable id, 
            Object[] currentState, Object[] previousState, 
            String[] propertyNames, Type[] types) { 
        // 每同步一次,修改的累加器加1 
        updates++; 
        for (int i = 0; i < propertyNames.length; i++) { 
            if ("lastUpdateTimestamp".equals(propertyNames[i])) { 
                currentState[i] = new Date(); 
                return true; 
            } 
        } 
        return false; 
    } 
 
    // 当加载持久化实体时,onLoad方法被调用 
    public boolean onLoad(Object entity, Serializable id, Object[] state, 
            String[] propertyNames, Type[] types) { 
        for (int i = 0; i < propertyNames.length; i++) { 
            if ("name".equals(propertyNames[i])) { 
                // 输出被装载实体的name属性值 
                System.out.println(state[i]); 
                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; 
    } 
 
    // 持久化所做修改同步完成后,调用postFlush方法 
    public void postFlush(Iterator entities) { 
        System.out.println("创建的次数: " + creates + ", 更新的次数: " + updates); 
    } 
 
    // 在同步持久化所做修改之前,调用preFlush方法 
    public void preFlush(Iterator entities) { 
    } 
 
    // 事务提交之前触发该方法 
    public void beforeTransactionCompletion(Transaction tx) { 
        System.out.println("事务即将结束"); 
    } 
 
    // 事务提交之后触发该方法 
    public void afterTransactionCompletion(Transaction tx) { 
        System.out.println("事务已经结束"); 
    } 

          上面易做图没有进行实际的操作,只是打印了一些标识代码。
          易做图可以有两种:Session范围内的,和SessionFactory范围内的。
          当使用某个重载的SessionFactory.openSession()使用Interceptor作为参数调用打开一个session的时候,就指定了Session范围内的易做图。         
[java]
Session session = sf.openSession( new MyInterceptor() ); 
          SessionFactory范围内的易做图要通过Configuration中注册,而这必须在创建SessionFactory之前。在这种情况下,给出的易做图会被这个SessionFactory所打开的所有session使用了         
[java]
new Configuration().setInterceptor( new MyInterceptor() ); 

         

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,