我正在尝试在grails域类中实现beforUpdate事件,我需要审核记录域属性的旧值和新值。我看到我们可以使用isDirty
检查或使用Domain.dirtyPropertyNames
返回域中脏的属性列表。并且getPersistentValue
获取表中的旧值,因此我可以同时拥有两个值..
为了实现这一点,我将在域类中使用beforUpdate事件并从那里调用日志服务,并将其传递给User域的id。现在使用此ID我可以获取用户实例服务,然后使用上面指定的方法检查是否有任何字段是脏的?或者,当我在UserController的update def?
中实际执行更新时,是否需要记录审核哪种方法更好?
我想确认这是否是正确的方法..
还有什么我需要照顾的事情,比如:
1)如果属性是域对象引用而不是简单类型。
2)我需要注意的任何其他事情,例如不要刷新hibernate会话,考虑在从域类调用服务时实现这一点。
问候,
Priyank
编辑:我在用户域的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')}"
}
我尝试从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异常(尝试在函数中使用withNew session但没有区别
在此先感谢..
答案 0 :(得分:0)
使用audit logging plugin而不是使用GORM事件处理程序进行审核日志记录。这会带走你的很多痛苦。
希望这有帮助。
或
如果你想要更好地控制你正在做的事情,你应该考虑使用Hibernate的EmptyInterceptor的子类。这将为您提供两种用途
Click here查看EmptyInterceptor的API。
注意:Hibernate不会在此类中提供任何实现,也不提供任何可能为您提供默认行为的子类。所以你必须编写一个自定义实现。