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. shell脚本基础1 概述及变量

    shell概述:在linux内核与用户之间的解释器程序通常指/bin/bash负责指向内核翻译及传达用户/程序指令相当于操作系统的"外壳" shell的使用方式:交互式--命令行: ...

  2. hi3531spi flash启动和bootrom启动的对比

    a

  3. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  4. 安装coreseek cannot find input file: src/Makefile.in 错误解决方法

    安装coreseek 出现了cannot find input file: src/Makefile.in 解决方法如下 >autoheader >automake --add-missi ...

  5. 运行Java Web项目报错

    运行Java Web项目报错 今天,我启动服务,发现项目报错,并且是在打开登录界面时报错. 具体错误如下: org.apache.catalina.core.Standard WrapperValue ...

  6. 嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示

    在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们 ...

  7. 【原】Java学习笔记029 - 映射

    package cn.temptation; import java.util.HashMap; import java.util.Map; public class Sample01 { publi ...

  8. IOS开发之XCode学习007:UIWindow对象

    此文学习来源为:http://study.163.com/course/introduction/1002858003.htm #import "AppDelegate.h" @i ...

  9. httpclient案例一(调用识别接口)

    public Map<String, Object> pictureRecognition(String recotype, MultipartFile imageFile) { Stri ...

  10. javaScript替换元素节点

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...