我在grails项目中使用GORM API反射(reflect)的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与当前对象进行比较。
可能?

最佳答案

通常,这可以通过在域实例上使用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实施自己的检查。这可能是在设置一个您稍后阅读的 transient 值。例如:
class Person {
  String firstName
  boolean firstNameChanged = false
  static transients = ['firstNameChanged']
  ..
  def beforeUpdate() {
    firstNameChanged = this.isDirty('firstName')
  }
  ..
  def afterUpdate() {
    if (firstNameChanged)
    ...
  }
...
}

07-24 09:17