Search code examples
grailsgrails-orm

Do I need a double save() after a domain modification using afterInsert()?


I have a domain class that modifies one of its properties in the afterInsert event.

A small example:

class Transaction {
   Long transactionId

   static constraints = {
       transactionId nullable: true
   }

   def afterInsert() {
       // copy the record id to transactionId;
       transactionId = id
   }
}

Whenever I save the domain object (transaction.save(flush: true)) in my unit tests, all is well, and the transactionId is updated. But when I try to find the saved record using Transaction.findByTransactionId(), I get no results:

   // do something
   transaction.save(flush: true)
   Transaction transaction = Transaction.findByTransactionId(1)
   // !! no results; transaction == null

And I have to do a double save() before I can find the record using findByTransactionId():

   // do something
   transaction.save(flush: true)
   transaction.save(flush: true)
   Transaction transaction = Transaction.findByTransactionId(1)
   // !! it works....

The double save() seems awkward. Any suggestions on how to eliminate the need for it?


Solution

  • This small piece of code makes it obviously work:

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

    So calling save in the afterInsert is needed to persist the changes made in afterInsert!