`
alexwei
  • 浏览: 40383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

用Hibernate Interceptor做审计(转贴)

阅读更多
在项目收尾阶段,客户突然提出一个很麻烦但也很正常的需求,系统内的一切改动都要进行记录。格式如:
    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更加无法完成的。
分享到:
评论

相关推荐

    HibernateInterceptor.java

    Hibernate4,Interceptor,spring,quartz

    Hibernate与struts2结合使用的demo

    Hibernate允许开发者用面向对象的方式处理数据,将Java对象和数据库表进行映射,从而避免了传统的JDBC操作带来的繁琐。它提供了一套完善的API,包括Session接口(用于数据库交互)、SessionFactory(负责创建Session...

    用struts与hibernate做的管理系统

    在"用Struts与Hibernate做的管理系统"中,我们首先会看到Struts如何处理登录、修改、删除和查询等基本功能。登录功能通常涉及用户验证,这包括从表单接收用户名和密码,通过Hibernate查询数据库进行匹配,如果验证...

    postman interceptor

    下面将详细介绍Interceptor的功能、使用方法以及其在API工作流程中的重要性。 一、Interceptor的功能 1. **实时同步**:Interceptor能够实时同步浏览器或应用中的网络请求到Postman,这意味着你可以在浏览器中浏览...

    Postman-Interceptor-V1.1.2.zip

    5. **文档生成**: 使用Interceptor,开发者可以轻松获取真实环境中应用产生的API调用,将这些数据用于生成详细的API文档,确保文档与实际操作保持一致。 安装过程如下: 1. 首先,你需要在Chrome浏览器中安装...

    jpaprojections:示例项目演示了如何使用Hibernate Interceptor and Envers,DTO Projection,Observer和Command设计模式

    使用Hibernate拦截器检测Persistence Context中的实体更改 使用Hibernate拦截器对数据库中的实体更改做出React 使用观察者设计模式来监视实体持久性更改并对其做出React 使用命令设计模式提供一种通用方法,可将...

    struts2整合hibernate的网上银行模拟项目

    Struts2 使用拦截器(Interceptor)机制来扩展功能,如验证、日志、事务管理等。在本项目中,可能会包含多个Action类,每个类对应特定的银行服务,如账户查询、转账、存款等。 接下来,我们来看Hibernate。...

    接口测试插件 Postman Interceptor 1.1.1

    **接口测试插件 Postman Interceptor 1.1.1** 接口测试是软件开发过程中的重要环节,它确保了不同系统、服务或组件之间的通信功能正常。Postman是一款广泛使用的接口测试工具,提供了丰富的功能来简化和自动化接口...

    Interceptor框架的实现

    Interceptor框架在软件开发中起着关键作用,尤其是在Java企业级应用中,如Spring AOP(面向切面编程)和各种框架中的拦截器机制。本文将深入探讨Interceptor框架的实现,主要涉及Java代理和反射技术。 首先,理解...

    谷歌浏览器插件—— Ajax Interceptor

    使用Ajax Interceptor 安装Ajax Interceptor后,它会在浏览器右上角出现图标,点击后显示当前页面所有正在进行的Ajax请求。你可以选择某个请求,查看其详细信息,包括URL、HTTP方法、请求头、请求体等,并对其进行...

    postman+postman interceptor(亲测可用)

    关于如何安装和使用Postman Interceptor,参照“安装步骤.txt”文件,通常会包含以下步骤: 1. **安装Postman**:首先确保已经在计算机上安装了Postman应用,可以从官方网站或者应用商店下载最新版本。 2. **安装...

    struts+hibernate整合jar包

    Struts和Hibernate是两个在Java Web开发中广泛使用的开源框架。Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作...

    Spring2.5+Hibernate3整合

    6. **Hibernate Interceptor**:可以自定义拦截器,实现对 Hibernate 操作的扩展,如日志记录、性能监控等。 7. **AOP(Aspect Oriented Programming)**:Spring 的 AOP 功能可用于实现如日志、事务管理等横切关注...

    Hibernate之struts2整合hibernate以及MVC分层架构的使用案例hibernate002

    在实际项目中,常常会将Hibernate作为持久层框架,与Struts2结合使用。整合过程中,通常需要配置Struts2的Action类来调用Hibernate的DAO(数据访问对象)层方法,进行数据的CRUD(创建、读取、更新、删除)操作。...

    Postman-Interceptor_0.2.20压缩文件

    本篇文章将深入探讨Postman Interceptor的特性、使用方法以及如何在Postman 4.1版本中与Interceptor_0.2.20配合使用。 Interceptor_0.2.20是Postman针对4.1版本的最佳适配版本,这意味着在这个版本下,Interceptor...

    Hibernate源码

    Hibernate是Java领域中一款广泛应用的关系型数据库对象映射框架,它简化了开发人员与数据库之间的交互,通过ORM(Object-Relational Mapping)技术将Java对象转换为SQL操作,从而实现数据持久化。Hibernate源码分析...

    Postman Interceptor for Chrome 0.2.26

    4. **跨设备同步**:当Interceptor与Postman应用配合使用时,你的请求历史记录和设置可以在不同设备之间同步,便于团队协作和项目管理。 5. **便捷的API开发**:Interceptor简化了API开发过程,开发者可以直接在...

    详解Retrofit Interceptor(拦截器) 拦截请求并做相关处理

    Retrofit Interceptor(拦截器) 的使用和实现 Retrofit Interceptor(拦截器) 是一个非常重要的组件,在 Retrofit 框架中扮演着关键角色。拦截器可以拦截请求并做相关处理,典型的处理方式是修改 header,但我们也...

    Hibernate+struts2框架

    在ListAction中,可能会使用Hibernate的Criteria API或HQL(Hibernate Query Language)来获取数据库中的用户列表,然后将这些数据封装到集合对象中,最后传递给JSP页面展示。对于详细信息展示,可能通过用户ID来...

Global site tag (gtag.js) - Google Analytics