因此,我们为一些grails对象(ref数据)提供了独特的“代码”,当我们想要检索它们时,我们通过使用它们的静态代码调用它们来实现:
Currency.findByCode(Currency.DOLLAR)
也许我完全错了,但这似乎是一种非常冗长且非常常的方法来检索对象(特别是当你必须多次执行它时,对于多个对象)。
是否有更接受的方法(可能在某处有对象本身的引用)?如果这是最好的方法,这是一个可以接受的答案。感谢。
答案 0 :(得分:3)
如果你使用静态变量,你可以做的另一件事是缩短代码是使用静态导入(这实际上是Java的一部分,但直到我转向groovy才找到它):
如果您在班级顶部执行CurrencyType的静态导入(可能是包含您已定义的各种类型货币的枚举):
static import com.example.CurrencyType.*
在您的代码中,您不再需要使用CurrencyType
为所有引用添加前缀,您可以这样做:
Currency.findByCode(DOLLAR)
如果它们不需要更改,您还可以向Currency类添加一个帮助方法来检索它:
Currency.groovy:
static import com.example.CurrencyType.*
...
static transients = ['dollar']
...
static Currency getDollar() {
Currency.findByCode(DOLLAR)
}
这样您就可以在其他代码中使用Currency.dollar
了。在这些类中,您还可以使用静态导入来引用dollar
:
static import com.example.Currency.*
....
println dollar // gets the dollar from the db and prints it out
答案 1 :(得分:2)
这取决于。这似乎是参考数据。如果参考数据永远不会改变,我根本不会使用持久层 - 我会编写一堆静态变量作为静态参考数据。
如果您希望能够在不重新部署的情况下更改参考数据,最实用的方法是从数据库加载它们。您可以使用某种类型的管理屏幕来操作数据。您可以使用像ehcache这样的二级缓存来限制持久层实际访问数据库的程度 - 您可以通过这种方式获得非常好的性能。请参阅用户指南的第5.5.2.2节。
但是,使用当前的方法,您必须重新部署参考数据的更改,因为需要对Currency.DOLLAR进行编码。不必这样做可能会很好。