Đinh Hồng Châu
Đinh Hồng Châu

Reputation: 5440

Grails domain beforeInsert / beforeUpdate

I want to save my domain class to the database without specifying the createdUser or createdDate. I’ve created an object called AuditingInfo and embedded it in the main Person domain class like this:

AuditingInfo.groovy:

class AuditingInfo {
    static constraints = {
        createdUser (nullable : true)
        updatedUser (nullable : true)
        createdDate(nullable : true)
        updatedDate(nullable : true)
    }

    static mapping = {
        columns {
            createdUsercolumn: 'T_CREATED_USER'
            updatedUsercolumn: 'T_UPDATED_USER'
            createdDatecolumn: 'T_CREATED_DATE'
            updatedDatecolumn: 'T_UPDATED_USER'
        }
    }

    User createdUser
    User updatedUser
    Date createdDate
    Date updatedDate
}

Person.groovy:

class Person {
    static embedded = ['auditingInfo']
    AuditingInfo auditingInfo

    static constraints = { auditingInfo(nullable: true) }
    String name
    Long id
}

I cannot use the beforeInsert and beforeUpdate events in the Person domain or AuditingInfo class, because it always causes a NullPointerException in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener. Therefore, I want to use the metaClass way, as used below (this action is defined in a *GrailsPlugin.groovy file, but unfortunately my project is a Grails project, not a Grails plugin project):

def doWithDynamicMethods = { ctx ->       
    application.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
        gc.metaClass.beforeInsert = {
        }

        gc.metaClass.beforeUpdate = {
        }
    }
}

How can I apply this method to my project context? Thank you so much.

Upvotes: 2

Views: 2897

Answers (2)

Don Clerecudzio
Don Clerecudzio

Reputation: 86

agree with doelleri

just add your code :

application.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
                    gc.metaClass.beforeInsert = {
                    }
                    gc.metaClass.beforeUpdate = {
                    }
        }

Into BootStrap.groovy

Upvotes: 2

doelleri
doelleri

Reputation: 19702

You can apply your metaClass modifications from within your Bootstrap.groovy, which is executed at start-up.

Upvotes: 3

Related Questions