笔记:Hibernate 拦截器和事件
Hibernate 在执行持久化的过程中,应用程序通常无法参与其中,通过事件框架,Hibernate 允许应用程序能响应特定的内部事件,从而允许实现某些通用的功能,或者对 Hibernate 进行扩展。
- 拦截器,通过 Interceptor 接口,可以从 Session 中回调应用程序的特定方法,这种机制可以让应用程序在持久化对象被保存、更新、删除或加载之前,检查并修改其属性,可以继承 EmptyInterceptor 类来重写拦截器业务,要使用拦截器需要如下几步:
- 继承 Interceptor 接口或者 EmptyInterceptor 类来定义拦截器
- 通过 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());
}
- 事件,Hibernate 的事件系统是功能更强大的事件框架,基本 Session 接口的每个方法都有对应的事件,比如 LoadEvent、FlushEvent等,当 Session 调用某个方法时,Hibernate 会生成对应的事件,并激活对应的事件监听器,实现用户的自定义监听器有如下方法:
- 实现对应的监听器接口:必须实现监听器接口的所以方法,关键时必须实现Hibernate对应的持久化操作,这意味着程序员完全取代了 Hibernate 的底层操作
- 继承事件适配器:可以有选择性的实现需要关注的方法,当依然试图取代Hibernate完成数据库的访问
- 继承系统默认的事件监听器:扩展特定方法
通常推荐使用第三种方法实现自己的事件监听器,默认的事件监听器如下:
- DefaultLoadEventListener:Session 的 load 方法的默认事件监听器
- DefaultSaveEventListener:Session 的 save 方法的默认事件监听器
- 其他默认事件监听器类,可以按照命名格式 Default[方法名称]EventListener 来,EventType 类提供事件类型
组成自定义事件监听器,Hibernate 提供了一个 EventListenerRegistry 接口,该接口提供如下三类方法来注册事件监听器:
- appendListeners():该方法有二个重载的版本,都用于将自定义的事件监听器追加到系统默认的事件监听器序列后面。
- prependListeners():该方法有二个重载的版本,都用于将自定义的事件监听器追加到系统默认的事件监听器序列前面。
- 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 拦截器和事件的更多相关文章
- Hibernate拦截器(Interceptor)与事件监听器(Listener)
拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ...
- Hibernate 拦截器
拦截器 你已经学到,在 Hibernate 中,一个对象将被创建和保持.一旦对象已经被修改,它必须被保存到数据库里.这个过程持续直到下一次对象被需要,它将被从持久的存储中加载. 因此一个对象通过它生命 ...
- 使用NHibernate(4)--拦截器和事件
如果想在一个事务的开始.执行中.完成后等过程中执行一些自己的逻辑(比如记录日志.查看sql),拦截器(Interceptors)和事件(Event)就可以发挥作用了.两者所能完成的功能差不多. 1,拦 ...
- NHibernate官方文档中文版--拦截器和事件(Interceptors and events)
对于应用程序来说,能够对NHibernate内部发生的事件做出响应式很有用的.这能够有助于实现一些类的功能或者扩展NHibernate的功能. 拦截器 IInterceptor接口提供了应用程序ses ...
- SpringMVC 学习笔记(六)拦截器
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- Struts2学习笔记(拦截器配置添加)
一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...
- Struts2笔记——自定义拦截器
需要两个步骤,自定义类实现拦截器接口和在struts.xml注册拦截器 =============================== 1.自定义类实现com.opensymphony.xwork2. ...
- Struts2 学习笔记18 拦截器原理分析
我们来进行一下拦截器的原理分析,从Struts2的源代码开始,然后我们手动创建一个项目进行模拟.(源代码需要下载然后添加好才能看到)我们可以用Debug来读源码. 从doFilter开始执行,流程如图 ...
- Struts2学习笔记五 拦截器
拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. Struts2中,拦截器是动态拦截Action调用的对象.它提供了一种机制可以使 ...
随机推荐
- shell脚本——mysql
很期待,学习shell脚本,减少重复工作 自动安装配置mysql脚本: #/bin/bash LOG_FILE=/home/hadoop1/log/installmysql.log function ...
- [微信JSSDK] 解决SDK注入权限验证 安卓正常,IOS出现config fail
实测有效 解决微信游览器和企业微信游览器JSSDK注入权限验证 安卓正常,IOS出现config fail 一开始我们想到的是可能微信这边的Bug,但细想一下应该不是.因为可能涉及到了IOS的底层原理 ...
- Disruptor3.0的实现细节
本文旨在介绍Disruptor3.0的实现细节,首先从整体上描述了Disruptor3.0的核心类图,Disruptor3.0 DSL(领域专用语言)的实现类图,并以Disruptor官方列举的几大特 ...
- xp+WinDBG+VMware调试内核
呵呵,搞点突兀的标题而已.其实说的还是如何使用WinDBG和VMware来搭建调试内核的环境而已,这些网上已经有数不清的教程了,不过我喜欢自己亲手写一下.第一,把这个过程写一遍能加深印象,就算以后忘记 ...
- VxWorks程序指南
******************************************* 一.任务 ******************************************* 任务状态:挂起 ...
- Python Numpy包安装
1,下载python 下载地址: https://www.python.org/downloads/windows/ 2,配置python环境变量 在电脑的系统属性的系统变量path中添加python ...
- Android APP开发入门教程-Button
代码编写 做好准备工作后,终于可以开始写我们的hello android了,在开始编写代码之前,我们先了解几个文件: res/layout/main.xml App主窗体布局文件,你的应用长什么样都在 ...
- 获取对固定列不重复的新DataTable
获取对固定列不重复的新DataTable ///<summary> /// 获取对固定列不重复的新DataTable /// </summary> ///<param ...
- spring配置datasource三种方式及具体信息
1.使用org.springframework.jdbc.datasource.DriverManagerDataSource说明:DriverManagerDataSource建立连接是只要有连接就 ...
- GridView 多余字符显示省略号,并在Tooltip中显示完整信息
效果 方法一:TemplateField 关键点 TemplateField的灵活性 CSS:overflow:hidden;text-overflow:ellipsis (溢出时隐藏;文本溢出时省略 ...