我正在嘗試在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會話
在此先感謝..
有很多方法可以做到這一點pri_dev,最好的方法可能取決於業務需求是什麼。您是否希望對用戶的所有更改進行記錄,或只更改其中的屬性?期望這個對象多久更新一次?您是否計劃將這些更改持久化到數據庫,由GORM映射的日誌文件..? – 2012-03-14 23:57:05
是的,我想將它添加到數據庫中的AuditLog域,我試圖從beforeUpdate和它的拋出hibernate異常做簡單的調用服務。我已經添加了編輯部分 – 2012-03-15 00:37:26
我還有一個非常重要的問題是,如果我在域中更新了2-3個屬性並調用save(),則會調用beforUpdate事件,但是也會調用Save事件?因爲創建和更新都是對domain.save()的調用我想知道Hibernate是否足夠聰明以基於新的現有域的創建和更新來觸發不同的事件。 – 2012-03-15 01:02:50