我有一个域类,可以在afterInsert
事件中修改其中一个属性。
一个小例子:
class Transaction {
Long transactionId
static constraints = {
transactionId nullable: true
}
def afterInsert() {
// copy the record id to transactionId;
transactionId = id
}
}
每当我保存域对象(transaction.save(flush: true)
)时
我的单元测试,一切都很好,,transactionId
已更新。但当我尝试使用Transaction.findByTransactionId()
找到保存的记录时,我没有结果:
// do something
transaction.save(flush: true)
Transaction transaction = Transaction.findByTransactionId(1)
// !! no results; transaction == null
在使用save()
找到记录之前,我必须做一个双findByTransactionId()
:
// do something
transaction.save(flush: true)
transaction.save(flush: true)
Transaction transaction = Transaction.findByTransactionId(1)
// !! it works....
双save()
似乎很尴尬。关于如何消除它的需求的任何建议?
答案 0 :(得分:1)
如果验证通过,对save()
的调用将返回持久化实体,因此之后没有任何理由单独查找。我认为您的问题是您正在重新实例化transaction
变量(使用相同的名称)。如果你必须查找(我不建议这样做),请将其称为其他内容。此外,如果列为1
,则您正在查找的AUTO-INCREMENT
ID可能不存在。
def a = a.save(flush: true)
a?.refresh() // for afterInsert()
Transaction b = (a == null) ? null : Transaction.findByTransactionId(a.id)
// (Why look it up? You already have it.)
<强>更新强>
因为你正在使用afterInsert()
,所以Hibernate可能没有意识到它需要刷新对象。致电save()
后,请尝试使用the refresh()
method。
答案 1 :(得分:0)
这段小代码显然有效:
def afterInsert() {
transactionId = id
save() // we need to call save to persist the changens made to the object
}
因此需要在afterInsert中调用save来保持afterInsert中所做的更改!