我有一份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()
的所有尝试。
建议
我认为最适合您的选择是:
save()
之前禁用该标志。另一种方法是实现一个自定义的save()
方法。 重要
此方法需要关闭autoTimestamp,因为ClosureEventListener会在调用
beforeUpdate()
后设置时间戳。因此,如果未关闭autoTimestamp,则将覆盖beforeUpdate()中对lastUpdated的更改。关于hibernate - 暂时禁用Grails自动标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32566060/