Grails,在具有复合id的域类上使用read()

时间:2012-12-06 17:23:54

标签: database grails groovy

我有一个很好的小域类,它由三个整数组成但没有主键(因为数据库设计不佳......重写不可能):

class Domain implements Serializable {

   Integer foo
   Integer bar
   Integer flag

    static mapping = {
        table 'domain'
        version false

        id  composite: ['foo', 'bar']
        foo column: 'foo_nbr'
        flag    column: 'value_I_want_flag'
        bar column: 'bar_nbr'   
    }
}

我希望能够使用foo和bar

的复合id通过read函数访问该标志

,例如

Integer yayFlag = Domain.read(foo, bar).flag

这是最好的做法吗?

2 个答案:

答案 0 :(得分:3)

根据docs on this,您应该能够通过get()语法引用原型对象:

def d = Domain.get(new Domain(foo: 23, bar: 999))

请注意,它还建议实施hashCode()equals()(使用id组件字段),并创建类Serializable

如果要求read(),您可以尝试相同,但我没有搜索来源以了解这是否有效(get()的参考文档实际上并未明确表明你可以做到以上几点,所以不要说在read()参考文档中没有结论。我已经离开Grails一段时间了,但您也可以在discard()之后尝试get()以避免在写入时写入数据库。

答案 1 :(得分:2)

你不能这样做,你需要像Brian提到的那样创建一个原型实例。您可以使用您想要使用的语法创建一个帮助器方法,以便为您工作:

static Domain read(int foo, int bar) {
   read new Domain(foo: foo, bar: bar)
}

您可能也想要一个类似的get方法。