就 envers 而言,基本用例是记录一个实体的完整审计(我们希望通过 @Audited 注解的参数)。对于您提到的情况,可能会正确添加新实体,但对于现有实体,它会出现问题,因为审计表中没有修订。
让我们借助一个场景来解决这个问题:
假设我们考虑的实体是users。现在为观察历史而创建的表是users_audit。除此之外,revinfo也将用于观察和记录对给定记录的所有更改。
首先问题来了,因为只要有更新,持久层就找不到修订记录。因此,要修复它,表中需要存在所有现有条目,并且与 revinfo 表的外键映射不应中断。因此,需要做两件事:
- 在 revinfo 表中插入临时值,以便 rev 可以充当外键
- 将数据从users表复制到users_audit表。
示例 Liquibase 文件可以是这样的:
CREATE TABLE `revinfo` (
`rev` int(11) NOT NULL AUTO_INCREMENT,
`revtstmp` bigint(20) DEFAULT NULL,
PRIMARY KEY (`rev`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `revinfo` (`revtstmp`) select updated_at from users u;
SET @position := 0;
insert into users_audit (
rev,
revtype,
id,
name,
type,
mobile_number,
password,
parent_id,
profile_image_uri,
is_active,
created_at,
updated_at
) select @position := @position +1, 0,
id,
name,
type,
mobile_number,
password,
parent_id,
profile_image_uri,
is_active,
created_at,
updated_at from us