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监听器的更多相关文章

  1. 利用Hibernate监听器实现用户操作日志

    网上搜索发现,实现用户操作日志的方式有:自定义注解方式.Hibernate拦截器方式.Hibernate监听器方式等. 1.自定义注解方式较为麻烦,需要进行操作记录的方法均需要添加注解,但是相对的操作 ...

  2. hibernate监听器的应用

    这里是我看到的一个hibernate监听器的简单实现供参考  http://www.360doc.com/content/14/0623/11/8072791_389034447.shtml 设计思路 ...

  3. AES实现财务数据的加密解密存储

    需求背景 众所周知,金融行业有各种各样的财务报表,有些报表涉及到公司财务或经营相关的敏感数据,需要进行加密存储,只有掌握密钥的用户才能看到解密后的数据.注意,这里所说的加密并不是针对整个数据库或者表全 ...

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

    拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ...

  5. SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】

    配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter ...

  6. hibernate的拦截器和监听器

    拦截器(Intercept):顾名思义,拦截操作,也就是在Hibernate做出动作之前会调用的方法.如果你有需要在Hibernate操作数据库之前想要做的操作,就需要用到这个东西了. 监听器(Lis ...

  7. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  8. Struts2+Spring+Hibernate框架整合总结详细教程

    一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

  9. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

随机推荐

  1. POJ 3185 The Water Bowls(高斯消元-枚举变元个数)

    题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...

  2. 深入学习android之AlarmManager

    对应AlarmManage有一个AlarmManagerServie服务程 序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,l ...

  3. GridView表头排序方法设置

    1.效果图 2.前台代码 说明:红色代码为核心代码 <asp:GridView ID="gvData" runat="server" AutoGenera ...

  4. Java程序员常用工具集

    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了.我想列下我能想到的一个Java程序员会用到的常用工具. 一.编码工具 1.IDE ...

  5. Swift入门篇-Hello World

    提示:如果您使用手机和平板电脑看到这篇文章,您请在WIFI的环境下阅读,里面有很多图片, 会浪费很多流量. 博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 最近这2天主要 ...

  6. Android 下压缩图片—微弱失真

    Android下压缩图片的方法: 大概能将3M左右的图片压缩到100K左右, 几乎不失真. 代码如下: import java.io.FileNotFoundException; import jav ...

  7. DB2之隔离级别和锁的论述

    在DB2数据库中, 是通过行级锁和表级锁协调作用来提供较好的并发性, 同时保证数据库中数据的安全. 在DB2中缺省情况下使用行级锁(当然需要IS/IX锁配合),只有当出现锁资源不足, 或者是用命令指定 ...

  8. AngularJS:实现动态添加输入控件功能(转)

    http://www.cnblogs.com/ilovewindy/p/3849428.html <!DOCTYPE html> <html> <head> < ...

  9. wap版和pc版的旋转js

    <script type="text/javascript"> var evt = "onorientationchange" in window ...

  10. HTML5全球普及加速:有望终结iOS与安卓界限【转】

    HTML5或将成为未来移动互联网时代的颠覆者. 5年前,当第一台iPhone诞生时,乔布斯断然拒绝了FlashPlayer,而选择HTML5(新型网页标准)取代Flash的功能.他曾预言,“虽然现阶段 ...