在beforeUpdate方法中更新域实例,无限地调用该方法

时间:2015-12-17 05:54:20

标签: grails gorm

我有一个域类,我需要在updateBofore方法上更新同一域的其他实例的某些值。但它将无限运行。有没有办法只更新一次?

Class ABC {

    String name
    String ref

    def beforeUpdate() {
        List abcs = findAllWhere(ref: ref)
        abcs.each {
            it.name = name
            it.save(flush: true)
        }

    }
}

2 个答案:

答案 0 :(得分:0)

使用before insert gorm事件而不迭代所有列表并调用save。

class ABC {
    //your defs here

    def beforeInsert() 
        List abcs = findAllWhere(ref: ref) 
        if(abcs){
          this.name = abcs.first().name
        }
    }
}

您必须在域类之外调用保存

ABC a = new ABC()
a.save()

并且beforeInsert制作技巧

答案 1 :(得分:0)

您需要修改beforeUpdate方法,例如:

def beforeUpdate() {
    def currentInstance = this

    ABC.withNewSession {
        List abcs = ABC.withCriteria {
            eq("ref", currentInstance.ref)
            // Make sure we don't again update the same current instance
            ne("id", currentInstance.id)
        }

        abcs.each {
            it.name = currentInstance.name
            it.save(flush: true)
        }
    }
}

beforeUpdate方法改变了两件事:

  1. 使用withNewSession以便新的save()操作不应该尝试刷新当前的hibernate会话(这将导致无限循环)
  2. 使用ne()条件排除当前实例的更新,因为您已经在更新当前实例。