更改域类之外的域类缓存设置

时间:2013-07-03 16:05:38

标签: caching grails grails-plugin grails-domain-class

我有一个包含一堆域类的插件。此插件由多个应用程序使用。

我的问题是我无法在域类本身中指定mapping->缓存设置(因为它们需要具有不同的值,具体取决于使用它们的应用程序)。例如,在应用程序A中,我想让域类X只读缓存,而域类Y不缓存。在应用程序B中,我希望将域类X事务缓存,并将域类Y只读缓存。

我想要的是什么(我希望这已经可用)类似于:

grails.gorm.default.mapping { cache true } 

但是,我可以只应用于特定的域类,而不是全局的,类似于:

grails.gorm.com.integralblue.domain.User.mapping { cache true } 

有人建议让每个域类检查grails配置,例如:

static mapping = {
    cache: Holders.grailsApplication.config.com.package.Person.cache ?: false
}

配置:

com.package.Person.cache = true

但我想尽可能避免这种情况

谢谢!

1 个答案:

答案 0 :(得分:0)

您提到的方法应该用于理想的案例场景中。 我同意必须在插件和应用程序中进行更改。

理想情况下,插件中的域类应提供可以覆盖的宽松映射。

如果您在插件或grails.gorm.default.mapping { cache true }中使用过cache: true或在域类中使用了//Domain class in Plugin class Person{ static mapping = { cache: 'read-only' } } ,则可以根据需要在应用程序中轻松覆盖它。例如:

//Application A:
Person.metaClass.'static'.mapping = {
    cache 'transactional'
}

//Application B:
Person.metaClass.'static'.mapping = {
    cache 'read-write'
}

由于映射只是一个groovy对象中的静态块,因此可以在运行时通过metaClassed在相关应用程序中轻松实现,如

//Application A BootStrap
grailsApplication.domainClasses.each{
    it.clazz.metaClass.'static'.mapping = {cache 'transactional'}
}

(未测试的)
如果你想为所有域类集体做同样的事情,那么域类artefact可以用如下

//Application A BootStrap
def personClazz = 
     grailsApplication.domainClasses.find{it.clazz.simpleName == 'Person'}.clazz
personClazz .metaClass.'static'.mapping = {cache 'transactional'}

选择性地:

{{1}}

*您必须在使用插件的应用程序中进行一些修改的任何一种情况。