近期项目要增加一个新的功能:数据变更历史记录。即针对某些实体类,要能查得到变化的历史痕迹。
假如项目界面不需要考虑展示或可读性,只需要在数据库中入库变更版本,最简便且可靠的方式就是使用Hibernate envers。关于Hibernate envers的介绍,还是请看官网:http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch15.html
在这里,我对它的使用方法做一些描述,我的环境是Hibernate4(4.3.6)、Spring4(4.1.1),数据是MYSQL,Hibernate envers 我下载的是4.3.5的版本,因为在这样的开发环境下,旧的envers版本不适用(可能是4以下?至少,在网上搜索出来的大部分配置方法已完全不起作用)。
1、jar包下载
2、hibernate.xfg.xml: 在sessionFactory中添加envers的配置数据
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> ..... <!-- 配置自动生成表--> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- 配置envers--> <!--配置审计表名的后缀,默认为空 --> <prop key="org.hibernate.envers.audit_table_suffix">_revinfo</prop> <!--配置审计表名的前缀,默认为_AUD --> <prop key="org.hibernate.envers.audit_table_prefix"></prop> <!--配置审计表中记录版本号的字段名称 --> <prop key="org.hibernate.envers.revision_field_name">REV</prop> <!--配置审计表中数据操作类型的字段名称,0:新增 1:修改 2:删除 --> <prop key="org.hibernate.envers.revision_type_field_name">REVTYPE</prop> <!--配置是否支持关联表修改时记录修改记录,默认为true --> <prop key="org.hibernate.envers.revision_on_collection_change">true</prop> <!--配置是否不对乐观锁字段修改时记录修改记录,即使用Version字段,默认值为true --> <prop key="org.hibernate.envers.do_not_audit_optimistic_locking_field">true</prop> <!--配置是否在删除操作时,记录所有字段还是只记录id值。默认为false false:只记录id true:记录全部字段 --> <prop key="org.hibernate.envers.store_data_at_delete">true</prop> <!--配置审计表的schema,默认为null --> <prop key="org.hibernate.envers.default_schema">lzzf</prop> <!--配置审计表的catalog,默认为null --> <prop key="org.hibernate.envers.default_catalog"></prop> ...... </props> </property> </bean>
3、配置要记录的实体和属性
@Audited表示要记录的实体
@NotAudited标记在属性的get方法之上,表示该字段不作变更记录
@Audited
@Entity
public class CaseInfo implements java.io.Serializable {
......
@NotAudited
public String getEventStatus() {
return this.eventStatus;
}
}
4、运行系统,可以看到数据库生成了两个表:
case_info_revinfo : 数据变更版本记录,包括了实体的ID、字段值、版本号(修订编号)、操作类型
revinfo:修订编号、操作时间戳
5、当修改该实体类的某字段值时,这两个数据表的变化如下:
case_info_revinfo : 数据变更版本记录,包括了实体的ID、字段值、版本号(修订编号)、操作类型
revinfo:修订编号、操作时间戳