最佳实践-通过静态字段获取grails中的域对象?

最佳实践-通过静态字段获取grails中的域对象?,grails,gorm,dynamic-finders,Grails,Gorm,Dynamic Finders,因此,我们对一些grails对象(ref数据)有唯一的“代码”,当我们想要检索它们时,我们通过使用静态代码调用它们来实现: Currency.findByCode(Currency.DOLLAR) 也许我完全错了,但这似乎是一种非常冗长且非groovy的检索对象的方法(尤其是当您必须多次检索多个对象时) 是否有一种更被接受的方法(可能在某处引用对象本身)?如果这是最好的办法,那是可以接受的答案。谢谢。视情况而定。这似乎是参考数据。如果引用数据永远不会改变,我就不会使用持久层——我会编写一组静态

因此,我们对一些grails对象(ref数据)有唯一的“代码”,当我们想要检索它们时,我们通过使用静态代码调用它们来实现:

Currency.findByCode(Currency.DOLLAR)
也许我完全错了,但这似乎是一种非常冗长且非groovy的检索对象的方法(尤其是当您必须多次检索多个对象时)


是否有一种更被接受的方法(可能在某处引用对象本身)?如果这是最好的办法,那是可以接受的答案。谢谢。

视情况而定。这似乎是参考数据。如果引用数据永远不会改变,我就不会使用持久层——我会编写一组静态变量,这些静态变量就是静态引用数据

如果您希望能够在不重新部署的情况下更改引用数据,最实用的方法是从数据库中加载它们。您将拥有某种类型的管理屏幕,可以在其中操作数据。您可以使用第二级缓存(如ehcache)来限制持久性层实际命中db的程度——这样可以获得非常好的性能。参见《用户指南》第5.5.2.2节


但是,使用当前方法,您必须在参考数据发生变化时重新部署,因为需要对Currency.DOLLAR进行编码。不必这样做可能会很好。

视情况而定。这似乎是参考数据。如果引用数据永远不会改变,我就不会使用持久层——我会编写一组静态变量,这些静态变量就是静态引用数据

如果您希望能够在不重新部署的情况下更改引用数据,最实用的方法是从数据库中加载它们。您将拥有某种类型的管理屏幕,可以在其中操作数据。您可以使用第二级缓存(如ehcache)来限制持久性层实际命中db的程度——这样可以获得非常好的性能。参见《用户指南》第5.5.2.2节


但是,使用当前方法,您必须在参考数据发生变化时重新部署,因为需要对Currency.DOLLAR进行编码。如果不必这样做可能会很好。

如果使用静态变量,可以缩短代码的另一件事是使用静态导入(这实际上是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

如果使用静态变量,可以缩短代码的另一件事是使用静态导入(这实际上是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

@igs,我想这是暗示的无论哪种方式,您都走在正确的道路上;)@igs,我想这是暗示的无论哪种方式,您都走在正确的道路上;)