Hibernate 在执行持久化的过程中,应用程序通常无法参与其中,通过事件框架,Hibernate 允许应用程序能响应特定的内部事件,从而允许实现某些通用的功能,或者对 Hibernate 进行扩展。

  1. 拦截器,通过 Interceptor 接口,可以从 Session 中回调应用程序的特定方法,这种机制可以让应用程序在持久化对象被保存、更新、删除或加载之前,检查并修改其属性,可以继承 EmptyInterceptor 类来重写拦截器业务,要使用拦截器需要如下几步:
    1. 继承 Interceptor 接口或者 EmptyInterceptor 类来定义拦截器
    2. 通过 Configuration 的 setInerceptor 方法 启用全局拦截器

       
       

      private static SessionFactory curSessionFatory;

       
       

      static {

      Configuration configuration = new Configuration().configure();

      StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder()

      .applySettings(configuration.getProperties());

       
       

      // 增加拦截器

      configuration.setInterceptor(new TestInterceptor());

       
       

      curSessionFatory = configuration.buildSessionFactory(registryBuilder.build());

      }

  2. 事件,Hibernate 的事件系统是功能更强大的事件框架,基本 Session 接口的每个方法都有对应的事件,比如 LoadEvent、FlushEvent等,当 Session 调用某个方法时,Hibernate 会生成对应的事件,并激活对应的事件监听器,实现用户的自定义监听器有如下方法:
    1. 实现对应的监听器接口:必须实现监听器接口的所以方法,关键时必须实现Hibernate对应的持久化操作,这意味着程序员完全取代了 Hibernate 的底层操作
    2. 继承事件适配器:可以有选择性的实现需要关注的方法,当依然试图取代Hibernate完成数据库的访问
    3. 继承系统默认的事件监听器:扩展特定方法

    通常推荐使用第三种方法实现自己的事件监听器,默认的事件监听器如下:

    1. DefaultLoadEventListener:Session 的 load 方法的默认事件监听器
    2. DefaultSaveEventListener:Session 的 save 方法的默认事件监听器
    3. 其他默认事件监听器类,可以按照命名格式 Default[方法名称]EventListener 来,EventType 类提供事件类型

    组成自定义事件监听器,Hibernate 提供了一个 EventListenerRegistry 接口,该接口提供如下三类方法来注册事件监听器:

    1. appendListeners():该方法有二个重载的版本,都用于将自定义的事件监听器追加到系统默认的事件监听器序列后面。
    2. prependListeners():该方法有二个重载的版本,都用于将自定义的事件监听器追加到系统默认的事件监听器序列前面。
    3. setListeners():该方法有二个重载的版本,都用于将自定义的事件监听器替换系统默认的事件监听器

    示例代码如下:

    static {

    Configuration configuration = new Configuration().configure();

    StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder()

    .applySettings(configuration.getProperties());

    curSessionFatory = configuration.buildSessionFactory(registryBuilder.build());

    // 获取
    EventListenerRegistry 接口

    EventListenerRegistry elr = ((SessionFactoryImpl)curSessionFatory).getServiceRegistry().getService(EventListenerRegistry.class);

    // 注册自定义监听器

    elr.appendListeners(EventType.LOAD, new CustomerListener());

    }

     
     

笔记:Hibernate 拦截器和事件的更多相关文章

  1. Hibernate拦截器(Interceptor)与事件监听器(Listener)

    拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ...

  2. Hibernate 拦截器

    拦截器 你已经学到,在 Hibernate 中,一个对象将被创建和保持.一旦对象已经被修改,它必须被保存到数据库里.这个过程持续直到下一次对象被需要,它将被从持久的存储中加载. 因此一个对象通过它生命 ...

  3. 使用NHibernate(4)--拦截器和事件

    如果想在一个事务的开始.执行中.完成后等过程中执行一些自己的逻辑(比如记录日志.查看sql),拦截器(Interceptors)和事件(Event)就可以发挥作用了.两者所能完成的功能差不多. 1,拦 ...

  4. NHibernate官方文档中文版--拦截器和事件(Interceptors and events)

    对于应用程序来说,能够对NHibernate内部发生的事件做出响应式很有用的.这能够有助于实现一些类的功能或者扩展NHibernate的功能. 拦截器 IInterceptor接口提供了应用程序ses ...

  5. SpringMVC 学习笔记(六)拦截器

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  6. Struts2学习笔记(拦截器配置添加)

    一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...

  7. Struts2笔记——自定义拦截器

    需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...

  8. Struts2 学习笔记18 拦截器原理分析

    我们来进行一下拦截器的原理分析,从Struts2的源代码开始,然后我们手动创建一个项目进行模拟.(源代码需要下载然后添加好才能看到)我们可以用Debug来读源码. 从doFilter开始执行,流程如图 ...

  9. Struts2学习笔记五 拦截器

    拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. Struts2中,拦截器是动态拦截Action调用的对象.它提供了一种机制可以使 ...

随机推荐

  1. 错误代码: 1582 Incorrect parameter count in the call to native function 'str_to_date'

    1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT t.`name`, DATE_FORMAT(str_to_d ...

  2. ClientAbortException: java.net.SocketException: Software caused connection abort: socket write erro

    1.错误描述 ClientAbortException: java.net.SocketException: Software caused connection abort: socket writ ...

  3. freemarker写select组件报错总结(四)

    1.错误描述 <html> <head> <meta http-equiv="content-type" content="text/htm ...

  4. Java注释分类

    Java注释分类 1.单行注释    //打印结果    System.out.println("结果是:"+result); 2.多行注释    /**     * @autho ...

  5. Tomcat 代码方式启动

    配置好参数,只需在Booter类中调用 EmbbedTomcat.main(args); 就可以启动. maven中也需要配置相应插件. import java.io.File; import org ...

  6. jQuery框架-1.基础知识

    jQuery简介 jQuery,顾名思义是JavaScript和查询(Query),jQuery是免费.开源的.它可以简化查询DOM对象.处理事件.制作动画.处理Ajax交互过程且兼容多浏览器的jav ...

  7. hihocoder #1456 : Rikka with Lattice(杜教筛)

    hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...

  8. 【洛谷1607】【USACO09FEB】庙会班车

    题面 题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市 ...

  9. [HEOI2016]游戏

    二分图匹配(网络流实现) # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a ...

  10. [BZOJ3110] [Zjoi2013] K大数查询 (树套树)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...