现在的项目用的框架是springMVC+hibernate,用的过程中发现每个实体类中都有4个相同的字段,在对实体做操作时并没有手动增删改这4个字段,但查看数据库时发现已经被赋值,经过查看发现框架中有这样一个类:
public class AuditTrailInterceptor extends EmptyInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
setValue(currentState, propertyNames, "lastUpdateBy", SessionUtils.getCurrentTpUserId());
setValue(currentState, propertyNames, "lastUpdateTm", new Date());
return true;
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
setValue(state, propertyNames, "createBy", SessionUtils.getCurrentTpUserId());
setValue(state, propertyNames, "createTm", new Date());
setValue(state, propertyNames, "lastUpdateBy", SessionUtils.getCurrentTpUserId());
setValue(state, propertyNames, "lastUpdateTm", new Date());
return true;
}
private void setValue(Object[] currentState, String[] propertyNames, String propertyToSet, Object value) {
int index = Arrays.asList(propertyNames).indexOf(propertyToSet);
if (index >= 0) {
currentState[index] = value;
}
}
}
再网上搜了一把EmptyInterceptor ,发现原来这是hibernate的一个高级特性:回调机制.
EmptyInterceptor类里面有很多方法,比如:
onFlushDirty:在实体对象update之前调用
onSave:在实体对象save之前调用
onDelete:在实体对象delete之前调用
然后spring配置文件里sessionFactory中加入这个扩展类
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.vmware.framework.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.id.new_generator_mappings">true</prop>
</props>
</property>
<property name="entityInterceptor">
<bean class="com.vmware.framework.common.hibernate.AuditTrailInterceptor" />
</property>
</bean>