Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object not persisting when saved in afterInsert event

I have a domain class like this:

 class Domain {
   String a
   int b
   String c
  ...


def afterInsert(){
       def anotherDomain = new AnotherDomain()
         anotherDomain.x=1
         anotherDomain.y=2

        if(anotherDomain.save()){
            println("OK")
         }else{
              println("ERROR")
          }

     }
  }

It prints "OK", I can even print the anotherDomain Object, and everything seems ok, no errors, nothing, but the anotherDomain Object doesn't persist in the database

like image 927
luisZavaleta Avatar asked Feb 16 '23 00:02

luisZavaleta


1 Answers

You cannot persist the domain to database unless you try to save withNewSession.

def beforeInsert(){
   def anotherDomain = new AnotherDomain()
     anotherDomain.x=1
     anotherDomain.y=2

    AnotherDomain.withNewSession{
       if(anotherDomain.save()){
           println("OK")
        }else{
             println("ERROR")
        }
    }
  }
}

All events are fired when domain object is flushed to database. Existing session is used for the flush. The same session cannot be used to handle save() on another domain. A new session has to used to handle the persistence of AnotherDomain.

UPDATE
Using beforeInsert event makes more sense than afterInsert. If x and y are dependent of any persisted value property of Domain they can very well be fetched from hibernate cache instead of going to db.

like image 91
dmahapatro Avatar answered Feb 24 '23 00:02

dmahapatro