使用afterInsert()修改域名后是否需要双重保存()?

时间:2012-06-01 11:51:32

标签: grails gorm

我有一个域类,可以在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()似乎很尴尬。关于如何消除它的需求的任何建议?

2 个答案:

答案 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中所做的更改!