文档章节

hibernate中拦截器与事件监听器的区别

z_jordon
 z_jordon
发布于 2015/04/22 21:48
字数 617
阅读 133
收藏 0

关于hibrenate中拦截器与事件监听器的介绍和使用的文章可以参看这篇文章:

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

关于在hibernate中使用拦截器实现增删改查日志记录的文章可参看这篇文章:

Hibernate4 拦截器(Interceptor) 实现实体类增删改的日志记录

拦截器与事件监听器的区别在于

  1. 监听器比拦截器提供更加细粒度的控制

    监听器可以提供以下几种级别的事件的监听:

而拦截器只提供以下几种事件的监听:

2. 监听器比拦截器更加底层,拦截器是在对应的监听器中被启动的,这点可以看hibernate的代码,比如在org.hibernate.event.internal.DefaultFlushEntityEventListener中调用了对应的拦截器,代码如下:

protected boolean invokeInterceptor(
			SessionImplementor session,
			Object entity,
			EntityEntry entry,
			final Object[] values,
			EntityPersister persister) {
		return session.getInterceptor().onFlushDirty(
				entity,
				entry.getId(),
				values,
				entry.getLoadedState(),
				persister.getPropertyNames(),
				persister.getPropertyTypes()
		);
	}

3.在监听器中可以取到session,但在拦截器中不行,比如前面那篇用拦截器实现增删改查日志的例子中只能很无奈的调用HibernateUtil.getSessionFactory().openSession()来重新打开一个session了,但在监听器中可以通过AbstractEvent的getSession方法来获取session,如下:

protected boolean handleInterception(FlushEntityEvent event) {
		SessionImplementor session = event.getSession();

4.但拦截器使用起来会比监听器直观,比如同样是想监听同步数据库前实体的状态,用拦截器的onFlushDirty方法可以很直接的取到更新前的状态和更新后的值,如下:

public boolean onFlushDirty(
			Object entity, 
			Serializable id, 
			Object[] currentState, 
			Object[] previousState, 
			String[] propertyNames, 
			Type[] types) {

其中,currentState是更新后的值,previousState是更新前的值。

而如果用监听器的话,需要先通过event中获取到对应的持久化实例,再从实例中获取到对应的属性,如下是在DefaultFlushEntityEventListener类中调用拦截器的过程:

EntityEntry entry = event.getEntityEntry();
		EntityPersister persister = entry.getPersister();
		Object entity = event.getEntity();
final Object[] values = event.getPropertyValues();
		final boolean intercepted = invokeInterceptor( session, entity, entry, values, persister );
protected boolean invokeInterceptor(
			SessionImplementor session,
			Object entity,
			EntityEntry entry,
			final Object[] values,
			EntityPersister persister) {
		return session.getInterceptor().onFlushDirty(
				entity,
				entry.getId(),
				values,
				entry.getLoadedState(),
				persister.getPropertyNames(),
				persister.getPropertyTypes()
		);
	}

所以综上几点,如果不需要非常细粒度的监听hibernate中的事件的话优先使用拦截器,但如果想在监听的同时获取到sessionc对象的又不想重新打开一个session的话请务必使用监听器。

© 著作权归作者所有

共有 人打赏支持
z_jordon
粉丝 36
博文 251
码字总数 78212
作品 0
厦门
技术主管
私信 提问
Hibernate的拦截器和监听器

最近项目需要,用到了Hibernate的拦截器和监听器,有些小小心得,和大家分享下。 首先说说这两个东西。 拦截器(Intercept):顾名思义,拦截操作,也就是在Hibernate做出动作之前会调用的方...

Zero零_度
2015/09/23
256
0
Hibernate基础知识汇总

ORM简介 ORM(Object/Relation Mapping),对象关系映射,ORM是一种规范,主要完成面向对象的编程语言到关系数据库的映射。 ORM框架是面向对象程序设计语言与关系数据库发展不同步时的中间解...

白志华
2015/09/17
6
0
spring boot(7)监听器、过滤器和拦截器

1 监听器、过滤器和拦截器 1.1 监听器 监听器Listener,它是实现了javax.servlet.XXXListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要...

刘胜球
2017/10/29
0
0
过滤器、监听器、拦截器的区别

1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客...

旋转木马-千里马
2016/01/20
86
0
servlet 拦截器、过滤器、监听器区别

过滤器,是在JavaWeb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后在传入Servlet或者Struts2的,action进行业务逻辑,比如过滤掉非法URL(不是login.do的请...

小风89
2016/06/30
148
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitMQ 在spring 的使用

一、准备工作 maven依赖 <dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  <version>4.0.2</version></dependency> <dependency......

狼王黄师傅
昨天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
6
0
day26:shell题

1、 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为AuthenticAMD,就显示其为AMD公司; 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,...

芬野de博客
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部