Домен Grails beforeInsert / beforeUpdate


Я хочу сохранить мой доменный класс в базе данных без указания createdUser или createdDate. Я создал объект под названием AuditingInfo и внедрил его в основной доменный класс Person следующим образом:

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
}

Я не могу использовать события beforeInsert и beforeUpdate в домене Person или классе AuditingInfo, потому что это всегда вызывает NullPointerException в org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener. Поэтому я хочу использовать способ metaClass, как показано ниже (это действие определено в файле *GrailsPlugin.groovy, но, к сожалению, мой проект-это проект Grails, а не проект плагина Grails):

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

        gc.metaClass.beforeUpdate = {
        }
    }
}

Как я могу применить этот метод к контексту моего проекта? Огромное спасибо.

2 2

2 ответа:

Вы можете применить свои модификации метакласса из вашего Бутстрэпа.заводной, который выполняется при запуске.

Согласен с доэллери

Просто добавьте свой код:

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

В Бутстрэп.заводной