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

时间:2012-03-14 23:17:53

标签: events grails dns beforeupdate

我正在尝试在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但没有区别

在此先感谢..

1 个答案:

答案 0 :(得分:0)

使用audit logging plugin而不是使用GORM事件处理程序进行审核日志记录。这会带走你的很多痛苦。

希望这有帮助。

如果你想要更好地控制你正在做的事情,你应该考虑使用Hibernate的EmptyInterceptor的子类。这将为您提供两种用途

  1. 可以更好地控制审核日志的内容和方式
  2. 将审计日志记录的所有逻辑放在一个位置,这将有助于您维护代码。
  3. Click here查看EmptyInterceptor的API。

      

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