笔记:Hibernate 拦截器和事件

时间:2024-05-02 13:36:08

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

    }