Find isDirty() for children elements

408 Views Asked by At

I'm using Grails 3.2:

class Training{
    boolean clientChanged = false
    static transients = ['clientChanged']

    static hasMany = [clients:User]
    //...

    def beforeUpdate(){
        clientChanged = this.isDirty('clients')
    }

    def afterUpdate(){
        if(clientChanged && section.clients)
            numberOfAbsentClients = section.clients.size() - (clients.size()?:0)
    }
}

isDirty() is not working for hasMany associations. how can I handle it?

1

There are 1 best solutions below

0
On BEST ANSWER

Collections are handled slightly differently. Depending on whether you are using Hibernate or one of the other implementations of GORM you need to check if the collection is a org.hibernate.collection.spi.PersistentCollection (for Hibernate) or a org.grails.datastore.mapping.collection.PersistentCollection (for MongoDB/Neo4j/etc)

The PersistentCollection interface has a isDirty() method that you can use to check if the association was changed. So something like:

 if(clients instanceof PersistentCollection && clients.isDirty()) { 
     ...
 }

Will do it.