暂时禁用grails autostamp

时间:2015-09-14 13:26:13

标签: hibernate grails domain-model

我有一个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)上更新的新字段的解决方案。

2 个答案:

答案 0 :(得分:3)

负责根据LoadModule passenger_module /usr/local/lib/ruby/gems/2.1/gems/passenger-5.0.18/buildout/apache2/mod_passenger.so LoadModule fastcgi_module libexec/apache24/mod_fastcgi.so <IfModule mod_passenger.c> PassengerRoot /usr/local/lib/ruby/gems/2.1/gems/passenger-5.0.18 PassengerDefaultRuby /usr/local/bin/ruby21 </IfModule> # Virtual hosts <VirtualHost *:80> ServerName www.mydomain.com DocumentRoot /usr/home/myusername/websites/myrailsappname/public <Directory /usr/home/myusername/websites/myrailsappname/public> AllowOverride all Options -MultiViews Order allow,deny Allow from all </Directory> </VirtualHost> Include etc/apache24/Includes/*.conf 映射设置设置时间戳的类是org.grails.orm.hibernate.support.ClosureEventListener

我尝试使用Groovy类别和拦截器拦截对 handleTimestampingBeforeUpdate 的调用:既没有奏效。我怀疑 ClosureEventListener 是在另一个线程中运行的。我没有尝试使用 ExpandoMetaClass ,因为这会导致全局更改,影响autoTimestamp的所有尝试。

建议

我认为最好的选择是:

  1. 关闭映射关闭中的autoTimestamp。
  2. 向域类添加一个临时布尔属性,并将其用作标志以启用/禁用更新lastUpdated属性。
  3. 将beforeUpdate Closure添加到您的域类中,并根据瞬态标志手动设置(或不设置)lastUpdated属性。
  4. 修改作业以在调用save()之前禁用该标记。另一种方法是实现执行此操作的自定义save()方法。
  5. 重要

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

答案 1 :(得分:0)

有一个名为autoTimeflag的标志

使用示例:

i-th