使用Domain.load()代理覆盖域CRUD方法

时间:2015-02-27 11:12:31

标签: grails gorm

我尝试覆盖某些域的delete()方法。 我在Bootstrap.init()方法中使用了以下代码:

    grailsApplication.domainClasses.each { clazz ->

        clazz.newInstance() // method to trigger metaclass wiring

        def gormDelete = clazz.metaClass.getMetaMethod('delete')
        clazz.metaClass.delete = { ->
            println "OVERRIDED DELETE() VERSION"
            // Code
            return gormDelete.invoke(delegate)
        }
    }

当我有一个真实的"域类(使用新的Domain()或Domain.get(),...)但在使用Domain.load()方法时它不起作用。

Domain.load(1).delete()使用标准的GORM delete()方法,而不是我的覆盖版本。

load()方法返回的类是一个代理(Domain _ $$ _ javassist_XX),它解释了为什么它不使用我的覆盖方法。

如何覆盖域CRUD方法和关联的域代理?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

ref-doc明确指出:

  

负载
   目的

     

返回给定标识符的域类的代理实例。

如果您仍想使用load()代替get(),则必须覆盖load()以及

答案 1 :(得分:0)

为什么要覆盖它们?向您的域添加remove()方法不会更好(更抽象):

void remove() {
    delete()
}

并根据需要更改实施