2012-03-14 68 views
4

我正在嘗試在grails域類中實現beforUpdate事件,我需要審計記錄Domains屬性的舊值和新值。我看到我們可以使用isDirty檢查或使用Domain.dirtyPropertyNames,它返回域中髒的屬性列表。和getPersistentValue獲取表中的舊值,所以我可以有兩個值..在grails中獲取更新後的域屬性的舊值

爲了實現這一點,我將使用在域類的beforUpdate事件並調用日誌服務從那裏,通過它用戶的id域。現在使用這個ID我可以獲取用戶實例在服務,然後檢查是否有任何領域使用上述指定的方法髒?或者當我真正在UserController的更新def中進行更新時,是否需要登錄審覈?

哪種方法更好?

我想如果這是正確的做法,以確認..
此外,我需要照顧了,像什麼其他的東西:
1)如果屬性域對象的引用,而不是簡單類型。
2)我需要注意的其他事情,如不清除休眠會話,考慮在從域類的服務調用中實現這一點。
問候,
Priyank

編輯:我想這在用戶域的前事件,我要審覈日誌更新活動..

def beforeUpdate = { 
GraauditService service = AH.getApplication().getMainContext().getBean(''graauditService) 
     service.saveUserUpdateEntry(this.id); // id property of User domain... 
} 

在服務中的方法,我做的:

def saveUserUpdateEntry(Long id){ 
    User grauser = User.get(id); 
    println ("user="+ grauser) 
    println "Dirty Properties -: ${grauser.dirtyPropertyNames}" 
    println "Changed value for firstName = -: ${ grauser.firstName}" 
    println "Database value for firstName = -: ${ grauser.getPersistentValue('firstName')}" 

    } 

我嘗試從UI做了更新電子郵件,名字,姓氏,並獲得在控制檯上執行以下操作:

user=com.gra.register.User : 1 
Dirty Properties -: [eMail, firstName, lastName] 
Changed value for firstName = -: sefser 
Database value for firstName = -: administer 

user=com.gra.register.User : 1 
Dirty Properties -: [] 
Changed value for firstName = -: sefser 
Database value for firstName = -: sefser 
possible nonthreadsafe access to session 

我不能夠知道:
1)爲什麼我會收到2套......是叫了兩聲,一旦前提交事件,並提交一次後...?
2)如何刪除或處理Hibernate的異常(試圖在功能,但沒有什麼區別使用爲new會話

在此先感謝..

+0

有很多方法可以做到這一點pri_dev,最好的方法可能取決於業務需求是什麼。您是否希望對用戶的所有更改進行記錄,或只更改其中的屬性?期望這個對象多久更新一次?您是否計劃將這些更改持久化到數據庫,由GORM映射的日誌文件..? – 2012-03-14 23:57:05

+0

是的,我想將它添加到數據庫中的AuditLog域,我試圖從beforeUpdate和它的拋出hibernate異常做簡單的調用服務。我已經添加了編輯部分 – 2012-03-15 00:37:26

+0

我還有一個非常重要的問題是,如果我在域中更新了2-3個屬性並調用save(),則會調用beforUpdate事件,但是也會調用Save事件?因爲創建和更新都是對domain.save()的調用我想知道Hibernate是否足夠聰明以基於新的現有域的創建和更新來觸發不同的事件。 – 2012-03-15 01:02:50

回答

0

而不是使用GORM事件處理程序審計日誌,使用audit logging plugin。如果你想更精細的控制,這將帶走大量你們的痛苦。

希望這有助於。

在你做什麼您應該考慮使用Hibernate的EmptyInterceptor的子類。這將有助於拖宗旨,爲您

  1. 會給你在更精細的控制什麼,以及你是如何做的審計日誌
  2. 將會把審計日誌記錄所有的邏輯在一個地方,這將有助於你保持你的碼。

Click here查看EmptyInterceptor的API。

注意:Hibernate不出貨在這個類中的任何實現,也沒有提供這可能爲您提供的默認行爲任何子類。所以你將不得不編寫一個自定義的實現。

+0

我們嘗試過,但是用於登錄負載事件(如XYZ一次登錄..)它難以使用相同的領域,他們有...我們不會想要維護2表,所以只是平移實現所有沒有插件,我也不知道如何獲得像ID被刪除的對象...使用插件時.. – 2012-03-15 05:32:27

+0

我不知道這個插件,但我認爲舊ID在'oldmap'中。 – Peter 2012-03-15 08:41:18