笔记: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调用的对象.它提供了一种机制可以使 ...
随机推荐
- MFC: 获得关机消息;阻止Windows关机
WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭,WM_ENDSESSION消息表示提示你Windows即将关闭.故当应用程序退出时, WM_QUERYENDSE ...
- iOS的GIF动画效果实现
引言:GIF图像格式是常见的一种动态图片格式,无论是在Web端还是在移动端都经常遇到,但是考虑目前iOS还无法原生展现GIF图片,而对于GIF的原生支持暂时也没有像JPG.PNG等图像格式支持得这么全 ...
- HighCharts之2D回归直线的散点
HighCharts之2D回归直线的散点 1.实例源码 ScatterLine.html: <!DOCTYPE html> <html> <head> <me ...
- freemarker自定义标签(一)
freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...
- Looks like the Spring listener was not configured for your web app!
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- C#图解教程 第十五章 接口
接口 什么是接口 使用IComparable接口的示例 声明接口实现接口 简单接口示例 接口是引用类型接口和as运算符实现多个接口实现具有重复成员的接口多个接口的引用派生成员作为实现显式接口成员实现 ...
- 洛谷U19464 山村游历(Wander)(LCT,Splay)
洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...
- [NOIP2017] 逛公园
[NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...
- HDU 3416 Marriage Match IV(最短路,网络流)
题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...
- PKUWC2018游记
PKUWC2018游记 Day -inf 从去年的12月底开始停课,到现在也有整整一个月的时间了. 前两周考的是OI赛制,后来就变成了IOI赛制. 整体上考的很炸,虐场的次数远少于被虐的次数. 关于去 ...