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.所有需要记录更改历史的VO implement Historizable接口。
History Interceptor根据 if ( entity instanceof Historizable)l来判断是否需要干活。
2.所有VO含有setLastModifyer()函数。在程序中把操作员名字传入。
3.创建HistoryEntry的POJO和hbm
包含如下的列 id,who,what,property,oldValue,newValue
4.创建一个History表,靠history_type列用继承映射为不同的子类,如GoodsHistory,CustomerHistory。
5.为所有需要纪录更改历史的对象在POJO和hbm中加入historyEntry Set。
6.留意属性除String,BigDecimal等基本类型外,其他内嵌对象要保证有Equals函数和toString()函数.
用hbm2java生成的java code, toString()函数输出的是ID,需要改为有意义的ID+name,
可以在hbm里把name属性的<meta>设为<meta-attribute name="is-tostring-value" value="true">
3.剩下的问题
1.单层的对象已经获得完美的解决,但对于订单的子对象又如何解决呢?
2.如何高效利用i18把被更改的表名和列名翻译成中文。
3.Spring虽可在<Session Factory>或者<trancetion manager>节点定义<Entity Interceptor>,但在onflushDirty()函数中老是拿不到previousState,虽然同事找到方法暂时解决了,但总是不正规.
其中问题1是Trigger更加无法完成的。
本文地址:http://com.8s8s.com/it/it11560.htm