在项目收尾阶段,客户突然提出一个很麻烦但也很正常的需求,系统内的一切改动都要进行记录。格式如:
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更加无法完成的。
分享到:
相关推荐
Hibernate4,Interceptor,spring,quartz
主要介绍了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
使用Hibernate拦截器检测Persistence Context中的实体更改 使用Hibernate拦截器对数据库中的实体更改做出React 使用观察者设计模式来监视实体持久性更改并对其做出React 使用命令设计模式提供一种通用方法,可将...
postman interceptor
InterCeptor
Postman-Interceptor下载
详细介绍struts2 interceptor
通过代理和反射实现一个Interceptor框架
本篇文章主要介绍了详解Retrofit Interceptor(拦截器) 拦截请求并做相关处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
包含postman的chrome插件,postman-interceptor插件,离线安装,即可使用
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
postman 和 postman interceptor。亲测可用,里边有说明博客
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
Postman-Interceptor_v0.2.20 .Postman Interceptor必须和Postman联合使用。
免费Postman和Postman interceptor压缩包,Postman为文件夹,直接选择扩展程序中的 加载已解压的扩展程序 ,选择解压后的postman文件夹即可,postman-interceptor为crx文件,直接拖入到chrome://extensions/中即可
logging-interceptor-3.14.4的jar包,用于okhttp网络拦截器
一个用于修改 ajax 请求响应的 chrome 扩展,修改ajax请求数据
使用拦截器时按如下步骤进行: (1)定义实现Interceptor接口的拦截器类 (2)通过Session启用拦截器,或者通过Configuration启用全局拦截器请看示例代码
postman-interceptor插件作为 postman插件的辅助插件,可以共享浏览器的session
postman以及interceptor,离线安装。。。。。。。。。。