Hibernate学习之---事件机制

Hibernate的事件框架由两个部分组成

  • 拦截器机制:对于特定动作拦截,回调应用中的特定动作。
  • 事件系统:重写Hibernate的事件监听器。

1.拦截器

通过Interceptor接口,可以从Session中回调应用程序的特定方法,这种回调机制可让应用程序在持久化对象被保存、更新、删除或加载之前,检查并修改其属性。

使用拦截器的步骤:

  • 定义实现Interceptor接口的拦截器类。
  • 通过Session启用拦截器,或者通过Configuration启用全局拦截器。

程序可以通过实现Interceptor接口来创建拦截器,但最后通过继承EmptyInterceptor来实现拦截器,EmptyInterceptor和Interceptor的关系就像事件监听器和事件适配器的关系。

拦截器的使用有两种方法:

  • 通过SessionFactory的openSession(Interceptor in)方法打开一个带局部拦截器的Session。
  • 通过Configuration的setInterceptor(Interceptor in)方法设置全局拦截器。

2.事件系统

基本上,Session接口的每个方法都有对应的事件,比如LoadEvent、FlushEvent等。当Session调用某个方法时,Hibernate Session会生成对应的事件,并激活对应的事件监听器。
监听器是单例模式对象,即所有同类型的事件处理共享同一个监听器实例,因此监听器不应该保存任何状态,即不应该使用成员变量。
使用事件系统的步骤:

  • 实现自己的事件监听器类。
  • 注册自定义事件监听器,代替默认的事件监听器。

实现用户的自定义监听器有如下三种方法:

  • 实现对应的监听器接口。
  • 继承事件适配器。
  • 继承系统默认的事件监听器:扩展特定的方法。

通常推荐采用第三种方法实现自己的事件监听器。Hibernate默认的事件监听器都被声明成non-final,以便用户继承它们。
扩展用户自定义监听器时,别忘了在方法中调用父类的对应方法。

为了让开发者注册自定义的事件监听器,Hibernate提供了一个EventListenerRegistry接口,该接口提供如下三类方法来注册事件监听器:

  • appengListeners():用于将自定义的事件监听器追加到系统默认的事件监听器序列的后面。
  • prependListeners():…的前面。
  • setListeners():用于将自定义的事件监听器代替系统默认的事件监听器序列。

上面三种注册方法的前两种注册方式不会覆盖Hibernate系统默认的事件监听器,因此用户开发的自定义事件监听器只要完成业务需要额外加入的操作即可。第三种方式注册的事件监听器会覆盖Hibernate系统默认的事件监听器,因此第三种方式注册的事件监听器除了完成业务额外加入的操作之外,还必须回调默认事件监听器所完成的操作。

事件系统是一种强大的扩展机制,只要开发者想对Hibernate的持久化操作添加额外的行为,都可通过扩展Hibernate的事件系统来实现。

扫描二维码关注公众号,回复: 2348610 查看本文章

猜你喜欢

转载自blog.csdn.net/stronghyq/article/details/76863845