文档章节

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

z_jordon
 z_jordon
发布于 2015/04/22 21:48
字数 617
阅读 117
收藏 0
点赞 0
评论 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
粉丝 35
博文 251
码字总数 78212
作品 0
厦门
技术主管
粗谈Hibernate——从执行顺序来看Hibernate

1.实例化Configuration对象 Hibernate在WEB-INF下查找hibernate.cfg.xml配置文件,根据hibernate.cfg.xml配置文件中配置的信息实例化Configuration对象 。如果使用了事件系统的话,在实例化C...

Robinson_lu
2015/06/18
0
0
Hibernate基础知识汇总

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

白志华
2015/09/17
6
0
Hibernate的拦截器和监听器

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

Zero零_度
2015/09/23
256
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
Spring Boot - Servlet、过滤器、监听器、拦截器

Spring Boot - Servlet、过滤器、监听器、拦截器 上一篇,我们讲解了spring boot(json,jsp,freemarker)配置及整合方法,不清楚的可以点击了解 Servlet的两种实现方式 通过@Bean手动注入 实现...

刘忠旭
2017/06/10
0
0
springside4如何配置hibernate拦截器or监听器自动填充某些实体数据

@江南白衣 你好,想跟你请教个问题:springside4如何整合hibernate拦截器or监听器自动填充某些实体数据

Juzz108
2013/01/30
731
1
Servlet,Filter,Listener,Interceptor的作用和区别

一、概念: 1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。Servlet 的主要功能...

hapier
2016/06/22
945
2
Hibernate下onUpdate处理机制

最近在处理一些数据多语言的支持技术。由于之前的系统没有对多语言支持和持久层采用Hibernate实现,所以考虑通过lifecycle接口,在对象持久化时,将多语言字段信息进行语言数据拼接,然后再进...

艳沐石
2013/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部