我正在尝试在 grails 域类中实现 beforUpdate 事件,我需要审核记录域属性的旧值和新值。我看到我们可以使用 isDirty
检查或使用 Domain.dirtyPropertyNames
它返回域中脏的属性列表。和 getPersistentValue
获取表中的旧值,因此我可以同时拥有这两个值。
为了实现这一点,我将在域类中使用 beforUpdate 事件并从那里调用日志服务,将用户域的 id 传递给它。现在使用这个 ID 我可以在服务中获取用户实例,然后使用上面指定的方法检查是否有任何字段是脏的?还是当我在 UserController 的更新定义中实际执行更新时需要记录审计?
哪种方法更好?
我想确认这是否是正确的方法..
还有我需要照顾的其他事情,比如:
1) 如果属性是域对象引用而不是简单类型。
2)我需要注意的任何其他事情,例如不刷新休眠 session ,考虑在从域类调用服务时实现这一点。
问候,
普里扬克
编辑:我在用户域的 beforeUpdate 事件中尝试了这个,我想审核更新事件的日志。
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')}"
}
我尝试从用户界面更新电子邮件、名字、姓氏,并在控制台上获得以下信息:
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异常(尝试在函数中使用withNew session但没有区别
提前致谢..
最佳答案
与其使用 GORM 事件处理程序进行审计日志记录,不如使用 audit logging plugin .这将消除你的很多痛苦。
希望这可以帮助。
或者
如果您想更好地控制您正在做的事情,您应该考虑使用 Hibernate 的 EmptyInterceptor 的子类。这将为您提供两个目的
Click here查看 EmptyInterceptor 的 API。
Note: Hibernate does not ship any implementation in this class and also don't provide any subclass of this which might provide you the default behavior. So you will have to write a custom implementation.
关于events - 在 grails 中获取更新的域属性的旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711807/