我有一份grails工作,正在对我的数据进行一些处理。这涉及在一些字符串操作之后更新标题字段。

我正在尝试使lastUpdated标记不受上述过程的影响,因为用户经常会按lastUpdated进行排序。

有没有办法暂时禁用autoTimestamp?我正在使用grails 2.4.5。

我尝试了这个建议,但没有用,并且极大地减慢了处理速度(将4秒改为30秒)

def toggleAutoTimestamp(target, enabled) {
    def applicationContext = (ServletContextHolder.getServletContext()
                              .getAttribute(ApplicationAttributes.APPLICATION_CONTEXT))

    def closureInterceptor = applicationContext.getBean("eventTriggeringInterceptor")
    def datastore = closureInterceptor.datastores.values().iterator().next()
    def interceptor = datastore.getEventTriggeringInterceptor()

    def listener = interceptor.findEventListener(target)
    listener.shouldTimestamp = enabled
    null
}

**更新**
另外,我也没有在寻找涉及创建仅在特定情况下(atm)更新的新字段的解决方案。

最佳答案

根据autoTimestamp映射设置负责设置时间戳的类为org.grails.orm.hibernate.support.ClosureEventListener

我尝试使用Groovy类别和Interceptor拦截对handleTimestampingBeforeUpdate的调用:两者均无效。我怀疑ClosureEventListener在另一个线程中运行。我没有尝试使用ExpandoMetaClass,因为这会进行全局更改,从而影响对save()的所有尝试。

建议

我认为最适合您的选择是:

  • 在映射闭包中关闭autoTimestamp。
  • 将 transient bool(boolean) 属性添加到域类,并将其用作标记来启用/禁用更新lastUpdated属性。
  • 将beforeUpdate闭包添加到您的域类中,并根据过渡标记手动设置(或不设置)lastUpdated属性。
  • 修改作业以在调用save()之前禁用该标志。另一种方法是实现一个自定义的save()方法。

  • 重要

    此方法需要关闭autoTimestamp,因为ClosureEventListener会在调用 beforeUpdate()后设置时间戳。因此,如果未关闭autoTimestamp,则将覆盖beforeUpdate()中对lastUpdated的更改。

    关于hibernate - 暂时禁用Grails自动标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32566060/

    10-14 08:12