`
studentGuy1
  • 浏览: 15688 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()方法之后被调用
  • beforeTransactionComplet<wbr>ion()<br> 在完成一个事务之前,调用此方法,这个方法可以改变事务的状态,例如回滚事务</wbr>
  • afterTransactionCompleti<wbr>on()<br> 当完成一个事务之后,立刻调用此方法</wbr>

使用拦截器实现审计日志
审计日志指的是,在应用系统中,对所有的数据库的操作都做记录,记录所操作内容,操作的用户和操作的时间

demo

log4j.properties

Log4j.properties代码复制代码收藏代码
  1. log4j.logger.com.rbh.examples=info,appender1
  2. log4j.appender.appender1=org.apache.log4j.FileAppender
  3. log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
  4. log4j.appender.appender1.File=ligfile.txt

LogEntityInterceptor

Java代码复制代码收藏代码
  1. packagecom.rbh.examples;
  2. importjava.io.Serializable;
  3. importorg.apache.log4j.Logger;
  4. importorg.hibernate.EmptyInterceptor;
  5. importorg.hibernate.type.Type;
  6. publicclassLogEntityInterceptorextendsEmptyInterceptor {
  7. privatestaticfinallongserialVersionUID = 1L;
  8. privateLogger logger = Logger.getLogger(LogEntityInterceptor.class);
  9. publicvoidonDelete(Object entity,Serializable id, Object[] state,String[] propertyNames,
  10. Type[] types){
  11. logger.info("删除数据");
  12. }
  13. publicbooleanonFlushDirty(Object entity,Serializable id, Object[] currentState,
  14. Object[] preState,String[] propertyNames,
  15. Type[] types){
  16. logger.info("修改数据");
  17. returnfalse;
  18. }
  19. publicbooleanonSave(Object entity,Serializable id, Object[] State,
  20. String[] propertyNames,
  21. Type[] types){
  22. logger.info("保存数据");
  23. returnfalse;
  24. }
  25. }

HibernateTest

Java代码复制代码收藏代码
  1. packagecom.rbh.examples;
  2. importjava.util.Date;
  3. importorg.hibernate.Session;
  4. importorg.hibernate.SessionFactory;
  5. importorg.hibernate.cfg.Configuration;
  6. publicclassHibernateTest {
  7. publicstaticvoidmain(String[] args)
  8. {
  9. HibernateTest test =newHibernateTest();
  10. test.testInterceptor();
  11. }
  12. publicvoidtestInterceptor()
  13. {
  14. LogEntityInterceptor interceptor=newLogEntityInterceptor();
  15. Configuration config=newConfiguration();
  16. config.setInterceptor(interceptor);
  17. config.configure();
  18. SessionFactory sf=config.buildSessionFactory();
  19. Session session=sf.getCurrentSession();
  20. Guestbook gb=newGuestbook();
  21. gb.setName("Narcissus");
  22. gb.setEmail("javac.q@gmail.com");
  23. gb.setCreatedTime(newDate());
  24. gb.setPhone("11102121");
  25. gb.setTitle("test Interceptor");
  26. gb.setContent("test Interceptor,test Interceptor");
  27. session.beginTransaction();
  28. session.save(gb);
  29. session.getTransaction().commit();
  30. session=sf.getCurrentSession();
  31. gb.setName("tom");
  32. session.beginTransaction();
  33. session.update(gb);
  34. session.getTransaction().commit();
  35. session=sf.getCurrentSession();
  36. session.beginTransaction();
  37. session.delete(gb);
  38. session.getTransaction().commit();
  39. }
  40. }

可以通过session方式加载拦截器对象,也可以通过Configuration对象加载拦截器

Configuration:对所有的session都会被拦截
session:只对当前的session进行拦截

Hibernate的事件监听机制

Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会执行监听器中的事件处理方法

在某些功能的设计中,我们即可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现

Hibernate中事件与对应的监听器接口

事件类型 监听器接口

auto-flush AutoFlushEventListener
merge MergeEventListener
delete DeleteEventListener
persist PersistEventListener
dirty-check DirtyCheckEventListener
evice EvictEventListener
flush FlushEventListener
flush-entity FlushEntityEventListener<wbr><br> load LoadEventListener<br> load-collection InitializeCollectEventLi<wbr>stener<br> lock LockEventListener<br> refresh RefreshEventListener<br> replicate ReplicateEventListener<br> save-update SaveOrUpdateEventListene<wbr>r<br> pre-load PreLoadEventListener<br> pre-update PreUpdateEventListener<br> pre-delete PreDeleteEventListener<br> pre-insert PreInsertEventListener<br> post-load PostLoadEventListener<br> post-update PostUpdateEventListener<br> post-delete PostDeleteEventListener<br> post-insert PostInsertEventListener</wbr></wbr></wbr>


应用Hibernate事件监听器

用户制定的事件监听器首先需要实现与所需要处理的事件对应的接口,或者继承实现这个接口的类

通过使用Hibernate的配置文件(hibernate.cfg.xml)配置事件监听对象,或者使用Configuration对象注册这个定制的事件监听器对象

LogPostLoadEventListener<wbr></wbr>

Java代码复制代码收藏代码
  1. importorg.hibernate.event.PostLoadEvent;
  2. importorg.hibernate.event.PostLoadEventListener;
  3. publicclassLogPostLoadEventListener<wbr></wbr>implementsPostLoadEventListener {
  4. privatestaticfinallongserialVersionUID = 404241098418965422L;
  5. publicvoidonPostLoad(PostLoadEvent event) {
  6. System.out.println("Class:"+ event.getEntity().getClass().getName() +",id:"
  7. + event.getId());
  8. }
  9. }

修改Hibernate.cfg.xml文件

Xml代码复制代码收藏代码
  1. <mappingresource="com/rbh/examples/Guestbook.hbm.xml"/>
  2. <listenertype="post-load"class="com.rbh.examples.LogPostLoadEventListener<wbr>"</wbr>/>
  3. </session-factory>
  4. </hibernate-configuration>

或者通过Configuration 对象注册这个监听器对象

Java代码复制代码收藏代码
  1. Configuration config =newConfiguration();
  2. config.setListener("post-load",newLogPostLoadEventListener<wbr>());</wbr>
  3. config.configure();
  4. Session session = config.buildSessionFactory().getCurrentSession();

编写、配置好监听器以后,当通过Session对象的load()、get()方法或者Query对象的list方法加载持久化对象之后,LogPostEventListener对象中的onPostLoad()方法就会被执行.

使用监听器实现审计日志

利用Hibernate的事件机制,不仅能够精确追踪到持久化对象的字段的修改,持久化对象关联关系的变更,还能记录更新前的数值和更新后的数值

监听器与拦截器的比较

监听器可以实现更细化粒度的拦截
通过监听器获取所拦截的持久化对象的修改后喝修改前的状态值
能直接通过Event对象获取Session对象

分享到:
评论

相关推荐

    拦截器和控制器的区别

    监听器 servlet application /session /request 6/8 个 1、拦截器 定义拦截器的包 定义拦截器的核心 定义拦截器类 &lt;interceptor name="myInterceptor" class="util.MyInterceptor"&gt;&lt;/interceptor&gt; 定义...

    Hibernate实战(第2版 中文高清版)

     12.3.2 拦截Hibernate事件   12.3.3 内核事件系统   12.3.4 实体监听器和回调   12.4 小结   第13章 优化抓取和高速缓存   13.1 定义全局抓取计划   13.1.1 对象获取选项   13.1.2 延迟的默认抓取...

    P6SPY JDBC拦截打印sql语句 非常好的调试工具

    P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...

    前后台管理系统模板源代码 java语言 ssh开发框架 Spring+Struts+Hibernate

    又实现了权限拦截器、项目监听器、单元测试等功能。 页面简洁大气美观,系统耦合度小,可配置度高,几乎包含了全部常用功能,是很好的学习和使用框架,可直接部署测试。 项目访问路径:...

    java后台框架源码

    entity:hibernate对应的orm与数据库表一一对应的实体类 filter:Log4jFormatFilter(格式化log4j日志输出的),SessionCheckFilter(登陆拦截器) interceptor:权限拦截包 listener:目前只有session的监听器,用于监听...

    从J2SE到J2EE知识点介绍

    5. Hibernate的事务与并发 238 (十) 数据库 240 1. 数据库的基本概念 240 2. 数据模型 240 3. 关系模型 241 数据流图(Data Flow Diagram,DFD) 241 E-R图 241 4. 关系规范化 242 5. Mysql 的安装 243 6. Transact-SQL...

    传智播客黑马35期

    day22_文件上传与下载 day23_基础加强 day24_在线支付&JavaMail; day25_编码实战day01 day26_编码实战day02 day27_编码实战day02 day28_struts2基础 day29_struts2加强 day30_struts2拦截器&ognl;表达式 ...

    从零开始学Spring Boot

    1.9 JPA - Hibernate 1.10 使用JPA保存数据 1.11 使用JdbcTemplate 1.12 Spring Boot修改端口号 1.13 Spring Boot配置ContextPath 1.14 Spring Boot改变JDK编译版本 1.15 处理静态资源(默认资源映射) 1.16 处理静态...

    ssh对lob完美处理

    structs1.2 spring2.5 hibernate3.0 java web 对clob大文本 blob图像处理 这是一个完整的例子,整合了ckeidtor,servlet直接显示...配置了监听器,SPRING事物管理,structs1.2拦截器配置 如果有疑问联系QQ:766591490

    spring in action英文版

     2.4.6 监听事件  2.4.7 发布事件  2.4.8 感知其他Bean  2.5 小结  第3章 创建切面  3.1 AOP介绍  3.1.1 定义AOP术语  3.1.2 Spring的AOP实现  3.2 创建通知  3.2.1 前置通知  3.2.2...

    Spring in Action(第2版)中文版

    11.3.4使用注释声明拦截器 11.4小结 第12章访问企业服务 12.1从jndi中获取对象 12.1.1使用传统的jndi 12.1.2注入jndi对象 12.1.3在spring2中注入jndi对象 12.2发送电子邮件 12.2.1配置邮件发送器 12.2.2...

    Spring in Action(第二版 中文高清版).part2

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

    Spring in Action(第二版 中文高清版).part1

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

    Java学习笔记-个人整理的

    {1.4.1}整数与浮点数}{23}{subsection.1.4.1} {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{subsection.1.4.2} {1.4.3}\texttt {char}}{24}{subsection.1.4.3} {1.4.4}转义...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.8 拦截器 332 8.9 依赖注入 335 8.9.1 EJB注入 336 8.9.2 资源注入 339 8.10 配置EJB引用 340 8.11 使用计时器进行任务调度 342 8.12 本章小结 345 第9章 消息驱动EJB 346 9.1 JMS和EJB 347 9.1.1 为什么使用MDB ...

    Spring.3.x企业应用开发实战(完整版).part2

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

    Spring3.x企业应用开发实战(完整版) part1

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

    Guns系统技术文档及视频

    │ │ │ ├─core----------------项目运行的核心依靠(例如aop日志记录,拦截器,监听器,guns模板引擎,shiro权限检查等) │ │ │ │ │ │ │ ├─modular----------------项目业务代码 │ │ │ │ │ │ │ ├─...

Global site tag (gtag.js) - Google Analytics