Что касается envers, основным вариантом использования является запись полного аудита объекта (параметры, которые мы хотим получить с помощью аннотации @Audited). В случае, который вы упоминаете, новые объекты могут быть добавлены правильно, но для существующих это вызовет проблему, поскольку в таблице аудита нет ревизии.
Давайте решим дело с помощью сценария:
Допустим, объект, который мы приняли во внимание, — это пользователи. Таблица, которая создается сейчас для наблюдения за историей, скажем, 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
person
smutneja03
schedule
01.12.2017