我在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
与当前对象进行比较。
可能是吗?
答案 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)
...
}
...
}