2017-08-03 16 views
0

問題摘要:僅當使用Hibernate Envers更改特定字段時才需要對數據庫行進行快照。基於字段級別值更改的休眠Entent

用到的技術:Spring BootSpring Data JPAHibernate Envers 5.2.10

當前的行爲:目前我有休眠Envers運行和IT審計所對每個對象進行表的改變。

步驟1:用戶表:當新用戶註冊,最初ACCOUNT_STATUS將EMAIL_VERIFICATION_PENDING

id user_name email_id   phone_number account_status 
------------------------------------------------------------------------- 
101 test_user [email protected] 123-123-1234 EMAIL_VERIFICATION_PENDING 

用戶審計表

id REV REVTYPE user_name email_id  phone_number account_status 
----------------------------------------------------------------------------------- 
1 1 0  test_user [email protected] 123-123-1234 EMAIL_VERIFICATION_PENDING 

步驟2:用戶表當電子郵件驗證已完成,則account_status已更改爲PHONE_VERIFICATION_PENDING

id user_name email_id   phone_number account_status 
------------------------------------------------------------------------- 
101 test_user [email protected] 123-123-1234 PHONE_VERIFICATION_PENDING 

用戶審計表看起來像

id REV REVTYPE user_name email_id  phone_number account_status 
----------------------------------------------------------------------------------- 
1 1 0  test_user [email protected] 123-123-1234 EMAIL_VERIFICATION_PENDING 
2 2 1  test_user [email protected] 123-123-1234 PHONE_VERIFICATION_PENDING 

第3步:用戶表:用戶改變自己的手機號碼

id user_name email_id   phone_number account_status 
------------------------------------------------------------------------- 
101 test_user [email protected] 111-222-3333 PHONE_VERIFICATION_PENDING 

現在用戶審計表看起來像

id REV REVTYPE user_name email_id  phone_number account_status 
----------------------------------------------------------------------------------- 
1 1 0  test_user [email protected] 123-123-1234 EMAIL_VERIFICATION_PENDING 
2 2 1  test_user [email protected] 123-123-1234 PHONE_VERIFICATION_PENDING 
3 3 1  test_user [email protected] 111-222-3333 PHONE_VERIFICATION_PENDING 

步驟4:用戶表:當電話驗證完成,則ACCOUNT_STATUS改變爲ACTIVE

id user_name email_id   phone_number account_status 
------------------------------------------------------------------------- 
101 test_user [email protected] 123-123-1234 ACTIVE 

和用戶審覈表看起來像

id REV REVTYPE user_name email_id  phone_number account_status 
----------------------------------------------------------------------------------- 
1 1 0  test_user [email protected] 123-123-1234 EMAIL_VERIFICATION_PENDING 
2 2 1  test_user [email protected] 123-123-1234 PHONE_VERIFICATION_PENDING 
3 3 1  test_user [email protected] 111-222-3333 PHONE_VERIFICATION_PENDING 
4 4 1  test_user [email protected] 111-222-3333 ACTIVE 

說明:每當用戶表中的任何更改,Hibernate Envers創建新修訂並在審計表中添加條目

試圖實現:當account_status發生任何更改時,Hiberate Envers會創建新修訂版。 基本上,我想從審計表中避免版本號3。這意味着我不想審計的電話號碼更改

有沒有什麼辦法可以控制Hibernate Envers只審計特定字段級別的變化(如account_status)?

誰能幫我實現這一目標的最佳途徑。

回答

0

有幾種方法可以實現這一點。

如您所知,Envers附帶兩個註釋@Audited@NotAudited

典型的標準使用案例是用戶在類級別放置@Audited註釋以指示Envers應該跟蹤所有字段更改並且確實如此。

如果在您不希望跟蹤這個用例的一個字段,你只需標註該領域與其他註釋,@NotAudited,如下所示:

@Audited 
@Entity 
class User { 
    ... 
    @NotAudited 
    private String phoneNumber; 
} 

這是爲了消除一個超級簡單的方法當您對大多數要跟蹤的字段更感興趣時,會從審覈表中獲取少量字段。但是有時用戶對反向方法感興趣,只跟蹤大部分不感興趣的字段子集。

在這種情況下,它的有用的,其註釋類本身,而是標註必須審計/跟蹤的特定字段,如下所示:

@Entity 
class User { 
    private String phoneNumber; 
    @Audited 
    private UserStatus status; 
} 

在這種情況下,phoneNumber未經審計的同時status屬性會。

雖然您可以將@Audited註釋放置在實體的主鍵字段上,但這不是必需的。 Envers會自動提取和應用主鍵值,這樣也有助於避免太多冗長。