当前位置:首页 > 开发 > 编程语言 > Hibernate > 正文

用Hibernate Interceptor做审计(转贴)

发表于: 2005-01-08   作者:alexwei   来源:转载   浏览次数:
摘要: 在项目收尾阶段,客户突然提出一个很麻烦但也很正常的需求,系统内的一切改动都要进行记录。格式如:     2004.1.1 12:30  郁也风 销售订单 订货日期 2004.1.2->2004.1.3        第一时间我就想到了也很AOP的Trigger,但Trigger毕竟和Java代码是
在项目收尾阶段,客户突然提出一个很麻烦但也很正常的需求,系统内的一切改动都要进行记录。格式如:
    2004.1.1 12:30  郁也风 销售订单 订货日期 2004.1.2->2004.1.3
  
    第一时间我就想到了也很AOP的Trigger,但Trigger毕竟和Java代码是两个世界,怎么把操作员名字传进去就有点麻烦(要所有表再加一个 last modifier的列,然后修改程序),同时Trigger一个很不够AOP的地方就是有多少个表就要写多少个Triger,有多少个列就要写多少列。
    Hibernate的Community Area 刚好有一篇History Interceptor的文章,很AOP的解决了这个问题。

1.Hibernate Inteceptor 概念
  Inteceptor--拦截器的概念源自AOP,在2.1.6中文版的参考手册里面这样写
  Interceptor接口提供从session到你的应用程序的回调方法,让你的程序可以在持久化对象保存/更改/删除或者装载的时候操作它的属性。典型代码:
public class AuditInterceptor implements Interceptor, Serializable 
{
   public boolean onFlushDirty(Object entity, 
                                Serializable id, 
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types) 
   {

        if ( entity instanceof Auditable ) 
       {
            for ( int i=0; i < propertyNames.length; i++ ) 
            {
                if ( "lastUpdateTimestamp".equals( propertyNames[i] ) ) 
               {
                    currentState[i] = new Date();
                    return true;
                }
            }
        }
        return false;
    }
}


当session被创建的时候,指定拦截器。
Session session = sf.openSession( new AuditInterceptor() );



可见,Interceptor的基本模式是
1.提供onLoad(),onSave(),onDelete,onFlushDirty()几个回调函数。
   在创建session时向session指定Interceptor.

2.每个回调函数的参数如下,已经足够作任何事情
   1.Object entity   对象
   2.Serializable id   对象的id
   3.String[] propertyNames  属性的名称数组
   4.Type[] types   属性的类型数组
   5.Object[] previousState  更新前的属性值
   6.Object[] currentState    更新后的属性值

3.在函数内,通过if ( entity instanceof Auditable )判断是否目标对象类型.

2.History Interceptor模式
1.所有需要记录更改历史的对象implement Historizable接口。
   History Interceptor根据 if ( entity instanceof Historizable)l来判断是否需要干活。

2.History Interceptor有setUserName()函数。在程序中把操作员名字传入。

3.创建HistoryEntry的POJO和hbm
   包含如下的列 id,who,what,property,oldValue,newValue

4.为所有需要纪录更改历史的对象分别创建一个History表,仅仅是表名不同,(或者用同一个表,复合主键?)

5.为所有需要纪录更改历史的对象在POJO和hbm中加入historyEntry Set。

3.剩下的问题
  1.单层的对象已经获得完美的解决,但对于订单的子对象又如何解决呢?

  2.因为使用Interceptor的session需要自行创建,与Spring的声明式事务管理如何结合?

  3.需要把被更改的表名和列名翻译成中文。

    其中问题1是Trigger更加无法完成的。

用Hibernate Interceptor做审计(转贴)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bea
拦截器(Intercept) :与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个
Hibernate拦截器(Interceptor)与事件监听器(Listener)   拦截器(Intercept):与Struts2的拦截器
作为 S2JH: 基于SSH的企业Web应用开发框架 提供相关技术点介绍系列,一方面算是给出自己对某一个特
作为 S2JH: 基于SSH的企业Web应用开发框架 提供相关技术点介绍系列,一方面算是给出自己对某一个特
一直没好好研究过如何用AS设置渐变型填充。周日终于有些时间可以好好研究一下了。 在AS中,设置渐变
最近发现一个很有意思的新闻,还没有来得及有时间翻译,这里转发出来 Headless Connected Oscillosc
上一篇中我进行了一下效果展示和概述,此篇开始将重现我此次尝试的步骤,我想大家通过阅读这些步骤
  声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!   几天前同事给我看了一个特效,
在Java 世界中我们很多的开发人员选择用Ant 来构建项目,一个build.xml 能够完成编译、测试、打包、
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号