至於envers而言,基本用例是記錄一個實體的完整的審計(參數我們希望通過@Audited註釋)。對於您提到的情況,可能會正確添加新實體,但對於現有的實體可能會帶來問題,因爲審計表中沒有修訂。
讓我們破案有場景的幫助:
比方說,我們已經考慮到實體用戶。現在創建的表格用於觀察歷史記錄,比方說,users_audit。除此之外,revinfo也將適用於觀察和記錄對於給定記錄的所有變化。
問題首先出現,因爲每當有更新時,持久層無法找到修訂記錄。因此,爲了解決這個問題,需要在表中存在所有現有的條目,並且不應該使用revinfo表進行外鍵映射。因此,需要兩件事情要做:
- 插入Temp值在revinfo表,以便轉可以作爲外鍵
- 複製從用戶行爲數據表到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
嗨!你解決了你的問題嗎?我也有同樣的問題。 – gipinani 2013-08-30 05:22:58
不,我給Envers並使用ON INSERT和ON UPDATE數據庫觸發器 – 2013-08-30 13:42:53