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

标签 events grails dns beforeupdate

我正在尝试在 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/

    相关文章:

    javascript - Highcharts 自定义事件插件右键单击事件未触发

    c# - 如何从 WPF KeyDown 事件中获取普通字符?

    email - 如何验证电子邮件发件人地址未被欺骗?

    c# - 如何检查 DNS 服务器是否设置为 'obtain automatically'

    dns - 如何在 Google Domain 中将裸域重定向到 www?

    c# - DLL 中的 ResolveEventHandler(类库)

    javascript - 停止在 designMode = "on"的文档内编辑某些元素;

    mysql - 如何使用 Grails 2.0 获得可为空的约束?

    forms - 提交错误数据后,如何在浏览器中处理URL并转换为表单 Action 值?

    grails - 如何从grails应用程序中读取日志文件?