Hibernate监听器
Hibernate的事件监听机制
Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会执行监听器中的事件处理方法
在某些功能的设计中,我们即可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现
Hibernate中事件与对应的监听器接口
org.hibernate.event. EventListeners
事件类型 监听器接口
auto-flush---- -------------AutoFlushEventListener
merge----------------------MergeEventListener
create----------------------PersistEventListener
delete----------------------DeleteEventListener
dirty-check----------------DirtyCheckEventListener
evict------------------------EvictEventListener
flush------------------------FlushEventListener
flush-entity----------------FlushEntityEventListener
load-------------------------LoadEventListener
load-collection-------------InitializeCollectionEventListener
lock--------------------------LockEventListener
refresh----------------------RefreshEventListener
replicate--------------------ReplicateEventListener
save-update---------------SaveOrUpdateEventListener
save------------------------SaveOrUpdateEventListener
update---------------------SaveOrUpdateEventListener
pre-load-------------------PreLoadEventListener
pre-update---------------PreUpdateEventListener
pre-delete----------------PreDeleteEventListener
pre-insert-----------------PreInsertEventListener
post-load-----------------PostLoadEventListener
post-update--------------PostUpdateEventListener
post-delete---------------PostDeleteEventListener
post-insert----------------PostInsertEventListener
post-commit-update-----PostUpdateEventListener
post-commit-delete------PostDeleteEventListener
post-commit-insert-------PostInsertEventListener
应用Hibernate事件监听器
用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类
通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象
LogPostLoadEventListener
import org.hibernate.event.PostLoadEvent;
import org.hibernate.event.PostLoadEventListener;
public class LogPostLoadEventListener implements PostLoadEventListener {
private static final long serialVersionUID = 404241098418965422L;
public void onPostLoad(PostLoadEvent event) {
System.out.println("Class:" + event.getEntity().getClass().getName() + ",id:"
+ event.getId());
}
}
使用监听器实现审计日志
利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值
拦截器(Interceptor)
org.hibernate.Interceptor接口定义了Hibernate中通用拦截机制
创建Session对象的时候,所有的Session对象或者这个Session对象的所有持久化操作的动作都会被指定的拦截器进行拦截.
Interceptor接口的方法
afterTransactionBegin()
当一个事务时候启动时,会立刻调用这个方法,这个方法可以改变这个事务的状态,例如:回滚事务
instantiate()
创建对象,如果返回null,则Hibernate将调用实体类的默认构造方法创建持久化对象
getEntity()
当一个持久化对象,通过标示符属性在Session对象的缓存中进行查找,并且没有找到时,会调用该方法
getEntityName()
当session对象获取持久化对象的名字时,会调用这个方法
onLoad()
该方法在持久化对象初始化之前加载,这个的持久化对象处于刚被创建的状态(对象的属性值都未赋值)
findDirty()
当调用Session对象的flush()方法时,讲调用该方法判断对象是否为脏数据,这是脏数据检查的另外拦截的实现方式
isTransient()
当调用Session对象的saveOrUpdate方法时,会调用该方法判断对象是否尚未保存
onSave()
在对象被保存之前调用,通过这个方法可以对要保持的对象的属性进行修改
onDelete()
该方法在持久化对象被删除之前调用
preFlush()
该方法当调用Session对象的flush()方法之前被调用
onFlushDirty()
当调用Session对象flush()方法进行脏数据检查时,如果发现持久化对象的状态发生了改变,会调用该方法
postFlush()
该方法调用Session对象的flush()方法之后被调用
beforeTransactionCompletion()
在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务
afterTransactionCompletion()
当完成一个事务之后,立刻调用此方法
使用拦截器实现审计日志
审计日志指的是,在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间
demo
log4j.properties
Log4j.properties代码
log4j.logger.com.rbh.examples=info,appender1
log4j.appender.appender1=org.apache.log4j.FileAppender
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender1.File=ligfile.txt
LogEntityInterceptor
package com.rbh.examples;
import java.io.Serializable;
import org.apache.log4j.Logger;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
public class LogEntityInterceptor extends EmptyInterceptor {
private static final long serialVersionUID = 1L;
private Logger logger = Logger.getLogger(LogEntityInterceptor.class);
public void onDelete(Object entity,Serializable id, Object[] state,String[] propertyNames,
Type[] types){
logger.info("删除数据");
}
public boolean onFlushDirty(Object entity,Serializable id, Object[] currentState,
Object[] preState,String[] propertyNames,
Type[] types){
logger.info("修改数据");
return false;
}
public boolean onSave(Object entity,Serializable id, Object[] State,
String[] propertyNames,
Type[] types){
logger.info("保存数据");
return false;
}
}
HibernateTest
package com.rbh.examples;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateTest {
public static void main(String[] args)
{
HibernateTest test =new HibernateTest();
test.testInterceptor();
}
public void testInterceptor()
{
LogEntityInterceptor interceptor=new LogEntityInterceptor();
Configuration config=new Configuration();
config.setInterceptor(interceptor);
config.configure();
SessionFactory sf=config.buildSessionFactory();
Session session=sf.getCurrentSession();
Guestbook gb= new Guestbook();
gb.setName("Narcissus");
gb.setEmail("javac.q@gmail.com");
gb.setCreatedTime(new Date());
gb.setPhone("11102121");
gb.setTitle("test Interceptor");
gb.setContent("test Interceptor,test Interceptor");
session.beginTransaction();
session.save(gb);
session.getTransaction().commit();
session=sf.getCurrentSession();
gb.setName("tom");
session.beginTransaction();
session.update(gb);
session.getTransaction().commit();
session=sf.getCurrentSession();
session.beginTransaction();
session.delete(gb);
session.getTransaction().commit();
}
}
可以通过session方式加载拦截器对象,也可以通过Configuration对象加载拦截器
Configuration:对所有的session都会被拦截
session:只对当前的session进行拦截
监听器与拦截器的比较
监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象
Hibernate监听器的更多相关文章
- 利用Hibernate监听器实现用户操作日志
网上搜索发现,实现用户操作日志的方式有:自定义注解方式.Hibernate拦截器方式.Hibernate监听器方式等. 1.自定义注解方式较为麻烦,需要进行操作记录的方法均需要添加注解,但是相对的操作 ...
- hibernate监听器的应用
这里是我看到的一个hibernate监听器的简单实现供参考 http://www.360doc.com/content/14/0623/11/8072791_389034447.shtml 设计思路 ...
- AES实现财务数据的加密解密存储
需求背景 众所周知,金融行业有各种各样的财务报表,有些报表涉及到公司财务或经营相关的敏感数据,需要进行加密存储,只有掌握密钥的用户才能看到解密后的数据.注意,这里所说的加密并不是针对整个数据库或者表全 ...
- Hibernate拦截器(Interceptor)与事件监听器(Listener)
拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ...
- SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】
配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter ...
- hibernate的拦截器和监听器
拦截器(Intercept):顾名思义,拦截操作,也就是在Hibernate做出动作之前会调用的方法.如果你有需要在Hibernate操作数据库之前想要做的操作,就需要用到这个东西了. 监听器(Lis ...
- 深入浅出Struts2+Spring+Hibernate框架
一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...
- Struts2+Spring+Hibernate框架整合总结详细教程
一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...
随机推荐
- VS2015中的异常配置
The New Exception Settings Window in Visual Studio 2015Managing Exceptions with the Debugger Underst ...
- IIS 10.0 无法安装 URL rewrite重写模块 2.0解决办法
[问题描述]系统升级到Windows10后,IIS是10.0的,发现无法安装 URLRewrite重写模块 2.0. [解决办法]打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWA ...
- UVa 10285 Longest Run on a Snowboard【记忆化搜索】
题意:和最长滑雪路径一样, #include<iostream> #include<cstdio> #include<cstring> #include <c ...
- sql2005主从数据库同步配置
网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...
- android studio获取SHA1
1 打开cmd,转到路径:C:\Users\usoft\.android 2 输入命令 keytool -list -v -keystore debug.keystore 3 输入命令 android ...
- error LNK2019: 无法解析的外部符号 __imp___CrtDbgReportW
error LNK2005 and error LNK2019 error LNK2019: unresolved external symbol __imp___CrtDbgReportW refe ...
- 【JSP】<meta>标签用法
转载自:http://blog.sina.com.cn/s/blog_65c74cce0102v39z.html 非常感谢这位博主,急着用,改日再细细品味重新整理这篇博文. http-equiv M ...
- ASP.NET MVC 教程汇总
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- JS 代码编一个倒时器
有时候在生活中,你需要一个JavaScript倒计时时钟,而不是一个末日装置设备.不管你是否有一次约会,销售.促销.或者游戏,你可以受益于使用原生JavaScript构建一个时钟,而不是拿到一个现成的 ...
- HDU 3695-Computer Virus on Planet Pandora(ac自动机)
题意: 给一个母串和多个模式串,求模式串在母串后翻转后的母串出现次数的的总和. 分析: 模板题 /*#include <cstdio> #include <cstring> # ...