笔记:Hibernate 拦截器和事件

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());

    }

    ?
    ?

时间: 2024-12-28 15:13:02

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

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

拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦截器是相似的,但它实现原理不同,它是为每一个事件注册一个或多个监听器,一旦事件发生,则事件源通知所有监听该事件的监听器,然后监听器处理通知(观察者模式). 拦截器 Hibernate为我们提供了实现拦截器的接口org.hibernate.Interceptor,它里面提供了许多拦截事件.通常不需要实

springmvc学习笔记(20)-拦截器

springmvc学习笔记(20)-拦截器 springmvc学习笔记20-拦截器 拦截定义 拦截器配置 针对HandlerMapping配置 类似全局的拦截器 拦截测试 拦截器应用实现登陆认证 需求 登陆controller方法 登陆认证拦截实现 本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. public

DB2使用Hibernate拦截器实现脏读(with ur)

工作需要,最近要让开发的系统底层适应的数据库增加对DB2的支持,虽然使用了DB2,但是就性能考虑,和业务需要.查询不需要进行事务控制,也就是DB2的多种事务安全级别,在查询时,不需要关注更新和插入.因此需要查询支持脏读.每条查询的sql语句后面都要增加with ur选项. 在网上找了很久,很多人在问,但是没有结果.最后,在google找到解决办法,使用hibernate拦截器,进行拦截.下面是代码: import org.hibernate.EmptyInterceptor; import or

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).

Struts学习笔记_拦截器

1.Struts架构图 2.Struts执行过程分析 3.Interceptor拦截器过程模拟 //main.java public class Main { public static void main(String[] args) { new ActionInvocation().invoke(); } } //ActionInvocation .java public class ActionInvocation { List<Interceptor> interceptors = n

java拦截器(Interceptor)学习笔记

1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式.在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作.目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可. 过滤器.监听器.拦截器差异图2,拦截器的原理    大部分时候,拦截

Hibernate学习---第十三节:hibernate过滤器和拦截器的实现

一.hibernate 过滤器 1.在持久化映射文件中配置过滤器,代码如下: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-

YMP框架学习笔记(三)------处理器、控制器、拦截器

一.处理器 1.事件处理器 添加类WebEventHandler.java并继承IWebEventHandler public class WebEventHandler implements IWebEventHandler { public void onInitialized() { } public void onRequestReceived(IRequestContext context) { } public void onRequestCompleted(IRequestCont

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------