如何检测afterUpdate | beforeUpdate GORM方法中已更新的字段

时间:2014-09-16 13:47:09

标签: grails gorm aop

我在grails项目中使用GORM API反映的afterUpdate方法。

class Transaction{

    Person receiver;
    Person sender;


}

我想知道修改哪个字段使afterUpdate的行为相应:

class Transaction{
     //...............
   def afterUpdate(){
      if(/*Receiver is changed*/){
        new TransactionHistory(proKey:'receiver',propName:this.receiver).save();
      }
      else
      {
      new TransactionHistory(proKey:'sender',propName:this.sender).save();
      }

   }
}

我可以使用beforeUpdate:在更新全局变量(之前为Transaction)之前赶上对象,然后在afterUpdate中,将previous与当前对象进行比较。 可能是吗?

1 个答案:

答案 0 :(得分:5)

通常,这可以通过在您的域实例上使用isDirty方法来完成。例如:

// returns true if the instance value of firstName 
// does not match the persisted value int he database.
person.isDirty('firstName')

但是,在您的情况下,如果您使用的是afterUpdate(),则该值已经保留到数据库中,并且isDirty将永远不会返回true。

您必须使用beforeUpdate实施自己的检查。这可能是设置您稍后阅读的瞬态值。例如:

class Person {
  String firstName
  boolean firstNameChanged = false
  static transients = ['firstNameChanged']
  ..
  def beforeUpdate() {
    firstNameChanged = this.isDirty('firstName')
  }
  ..
  def afterUpdate() {
    if (firstNameChanged)
    ...
  }
...
}