Caching 更改域类外部的域类缓存设置

Caching 更改域类外部的域类缓存设置,caching,grails,grails-plugin,grails-domain-class,Caching,Grails,Grails Plugin,Grails Domain Class,我有一个插件,它有一堆域类。此插件由多个应用程序使用 我的问题是,我不能在域类本身中指定映射->缓存设置(因为它们需要有不同的值,这取决于使用它们的应用程序)。例如,在应用程序A中,我希望以只读方式缓存域类X,而不缓存域类Y。在应用程序B中,我希望将域类X事务性缓存,而域类Y只读缓存 我想要的(我希望这已经有了)是这样的: grails.gorm.default.mapping { cache true } grails.gorm.com.integralblue.domain.User.m

我有一个插件,它有一堆域类。此插件由多个应用程序使用

我的问题是,我不能在域类本身中指定映射->缓存设置(因为它们需要有不同的值,这取决于使用它们的应用程序)。例如,在应用程序A中,我希望以只读方式缓存域类X,而不缓存域类Y。在应用程序B中,我希望将域类X事务性缓存,而域类Y只读缓存

我想要的(我希望这已经有了)是这样的:

grails.gorm.default.mapping { cache true } 
grails.gorm.com.integralblue.domain.User.mapping { cache true } 
但我可以只应用于特定的域类,而不是全局类,例如:

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
但如果可能的话,我想避免这种情况


谢谢

您提到的方法应该在理想情况下使用。 我同意必须对插件和应用程序进行更改

理想情况下,插件中的域类应该提供可重写的宽松映射

如果您在插件中使用了
grails.gorm.default.mapping{cache true}
,或者在域类中使用了
cache:true
或哪个映射,则可以根据需要在应用程序中轻松重写它。例如:

//Domain class in Plugin
class Person{
   static mapping = {
      cache: 'read-only'
   }
}
由于映射只不过是groovy对象中的一个静态块,所以可以在运行时轻松地在相关应用程序中进行元类化,如

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

//Application B:
Person.metaClass.'static'.mapping = {
    cache 'read-write'
}
(未经测试)
如果您希望对所有域类共同执行相同的操作,那么可以使用域类人工制品,如下所示

//Application A BootStrap
grailsApplication.domainClasses.each{
    it.clazz.metaClass.'static'.mapping = {cache 'transactional'}
}
选择性地:

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

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

为什么要避免这种方法?更改此插件中的域类并将其重新发布到其他项目都很糟糕,而且这意味着具有其他类的其他项目将需要进行相同的缓存修改,这最终会成为一个大麻烦。所以,如果我能避免这种情况,那就太好了。这不一定是技术原因,更多的是官僚主义原因。这会覆盖现有的映射块还是它会附加?这会覆盖,是的,您必须指定@AlexBeardley的所有映射。此外,在grails查看映射并处理映射之前是否会运行引导?事实上,我不熟悉事情的执行顺序。@AlexBeardsley Yes bootstrap在应用程序启动时运行。我对在
映射
中附加内容非常怀疑,我可以看看这是否是一个选项。同样,这是一个容易出错的路由,您不想弄乱现有的映射。我刚刚给了你一个解决办法,你建议的路线应该尝试一下。我现在正在搞乱它,看起来引导的初始化是在grails处理域类之后发生的,所以对块的更改没有任何效果。即使尝试在运行时使用一些虚拟服务来更改它,也不会更改缓存行为。