Events 获取grails中更新的域属性的旧值

Events 获取grails中更新的域属性的旧值,events,grails,dns,beforeupdate,Events,Grails,Dns,Beforeupdate,我正试图在grails域类中实现beforUpdate事件,我需要审计记录域属性的新旧值。我发现我们可以使用isDirty检查或使用Domain.dirtyPropertyNames返回域中脏的属性列表。并且getPersistentValue获取表中的旧值,这样我就可以同时拥有这两个值 为了实现这一点,我将在域类中使用beforUpdate事件,并从那里调用日志服务,将用户域的id传递给它。现在,使用这个ID,我可以获得服务中的用户实例,然后使用上面指定的方法检查是否有字段是脏的?或者,当我在

我正试图在grails域类中实现beforUpdate事件,我需要审计记录域属性的新旧值。我发现我们可以使用
isDirty
检查或使用
Domain.dirtyPropertyNames
返回域中脏的属性列表。并且
getPersistentValue
获取表中的旧值,这样我就可以同时拥有这两个值

为了实现这一点,我将在域类中使用beforUpdate事件,并从那里调用日志服务,将用户域的id传递给它。现在,使用这个ID,我可以获得服务中的用户实例,然后使用上面指定的方法检查是否有字段是脏的?或者,当我在UserController的更新定义中实际执行更新时,是否需要记录审核

哪种方法更好

我想确认这是否是正确的方法。
还有什么我需要注意的事情,比如:
1) 如果属性是域对象引用而不是简单类型
2) 任何其他我需要注意的事情,比如不刷新hibernate会话,考虑在域类的服务调用中实现此功能。
问候,
普里扬克

编辑:我在要审核更新活动日志的用户域中的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) 如何删除或处理Hibernate异常(尝试在函数中与New session一起使用,但没有区别


提前感谢。

与其使用GORM事件处理程序进行审核日志记录,不如使用。这将减轻您的许多痛苦

希望这有帮助

如果你想更好地控制你正在做的事情,你应该考虑使用Hibernate的Apple Ty拦截器的子类。这将为你

提供两个目的。
  • 这将使您能够更好地控制审计日志记录的内容和方式
  • 将审计日志记录的所有逻辑放在一个地方,这将帮助您维护代码
  • 查看EmptyInterceptor的API

    注意:Hibernate不在此类中提供任何实现,也不提供任何可能为您提供默认行为的子类。因此,您必须编写自定义实现


    在开发之前,有很多方法可以做到这一点,最好的方法可能取决于业务需求。您希望记录对用户的每一项更改,还是只记录更改的属性?您希望此对象多久更新一次?您是否计划将这些更改持久化到数据库(GORM映射的某个数据库,一个日志文件)。.?是的,我想将其添加到数据库中的AuditLog域,我尝试从beforeUpdate进行简单的服务调用并引发hibernate异常。我添加了编辑部分。我还有一个真正重要的问题,就是,如果我更新了域中的2-3个属性并调用save()调用了beforUpdate事件,但是否也调用了Save事件?因为create和update都是对domain.Save()的调用。我想知道Hibernate是否足够聪明,可以根据现有域的新创建和更新触发不同的事件。我们尝试了这一点,但用于记录onLoad事件(例如每次登录XYZ…)很难使用他们拥有的同一个域…而且我们不习惯维护2个表,所以在没有插件的情况下,只需平移来实现所有,而且我不知道如何获得被删除对象的ID…在使用插件时..我不知道这个插件,但我假设旧ID在
    oldmap
    中。