1

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()似乎很尴尬。关于如何消除对它的需要的任何建议?

4

2 回答 2

1

如果验证通过,调用save()将返回持久实体,因此没有任何理由在之后单独查找它。我认为您的问题是您正在重新实例化transaction变量(使用相同的名称)。如果您必须查找它(我不建议这样做),请将其称为其他名称。此外,1如果该列是AUTO-INCREMENT.

      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 可能没有意识到它需要刷新对象。调用后尝试使用refresh()方法save()

于 2012-06-01T17:20:21.643 回答
0

这段小代码使它显然可以工作:

def afterInsert() {
    transactionId = id
    save() // we need to call save to persist the changens made to the object
}

因此需要在 afterInsert 中调用 save 来持久化在 afterInsert 中所做的更改!

于 2012-06-04T05:29:48.877 回答