Домен Grails beforeInsert / beforeUpdate - PullRequest
2 голосов
/ 14 февраля 2012

Я хочу сохранить класс своего домена в базе данных без указания 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 ]

3 голосов
/ 14 февраля 2012

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

2 голосов
/ 15 февраля 2012

согласен с doelleri

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

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

В BootStrap.groovy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...