用Hibernate Interceptor很AOP的搞定对象修改纪…
2008-02-23 10:14:22来源:互联网 阅读 ()
2004.1.1 12:30 郁也风 销售订单 订货日期 2004.1.2->2004.1.3
第一时间我就想到了也很AOP的Trigger,但Trigger毕竟和Java代码是两个世界,怎么把操作员名字传进去就有点麻烦(要所有表再加一个last modifier的列,然后修改程序),同时Trigger一个很不够AOP的地方就是有多少个表就要写多少个Trigger,有多少个列就要写多少列。
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 = sf.openSession( new AuditInterceptor() );
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 更新后的属性值
1.所有需要记录更改历史的VO implement Historizable接口。
History Interceptor根据 if ( entity instanceof Historizable)l来判断是否需要干活。
2.所有VO含有setLastModifyer()函数。在程序中把操作员名字传入。
包含如下的列 id,who,what,property,oldValue,newValue
用hbm2java生成的java code, toString()函数输出的是ID,需要改为有意义的ID name,
可以在hbm里把name属性的<meta>设为<meta-attribute name="is-tostring-value" value="true">
1.单层的对象已经获得完美的解决,但对于订单的子对象又如何解决呢?
2.如何高效利用i18把被更改的表名和列名翻译成中文。
上一篇: Java Portlet规范的参考实现-Pluto项目介绍(1)
下一篇: JBuilder X配置的几个问题
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash