Grails domain beforeInsert / beforeUpdate

2019-01-27 00:09发布

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.

2条回答
Root(大扎)
2楼-- · 2019-01-27 00:20

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

查看更多
放我归山
3楼-- · 2019-01-27 00:22

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

查看更多
登录 后发表回答