我在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)
...
}
...
}