2012-12-06 46 views
2

我有一個很好的小域類,它由三個整數組成,但沒有主鍵(由於數據庫設計不佳......重寫不可行) :Grails,使用複合ID爲域類的read()

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的複合ID通過讀函數訪問標誌和酒吧

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

是否有一個最佳實踐呢?

+0

你應該刪除'String id',因爲id是一個組合,並且該字段將不會被使用 –

回答

3

按照docs on this,你應該能夠通過get()語法與原型對象引用:

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

注意,它也建議(使用id分量場)實施hashCode()equals(),並使類Serializable

如果read()是一個需求,你可以嘗試相同的,但我沒有搜索源,知道這是否會工作(參考文檔get()實際上並沒有明確表明你可以做到上述,所以不要說在read()的參考文檔中並不確定)。我已經離開了Grails一段時間,但是您也可以在get()之後嘗試discard()以避免數據庫在同花順時寫入。

+0

嗯,對於類甚至編譯啊,我不得不使它可序列化。而我之所以使用閱讀原因是因爲數據庫覆蓋有多強大。我不知道丟棄(),這非常有趣!雖然我根據foo和bar創建了一個新的實例,但我什麼也得不到,只有null。 – PJT

+1

你是否有equals()和hashcode()定義(只)ID的角色?可以想象有一些基於此的實例緩存,但我不認爲這將是第一個get()的問題。 –

+0

我沒有hasCode()和equals()方法我正在研究它們,但現在。 – PJT

2

你不能那樣做,你需要像Brian提到的那樣創建一個原型實例。你可以用你想用,做的工作,你的語法創建一個輔助方法:

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

您可能希望通過類似的方法get過。

+0

我試着用原型實例創建這個幫助器方法,並使用讀取和嘗試獲取以及。我一直得到空。所以我決定使用Domain.findWhere(foo:foo,bar:bar),然後我得到了預期的結果。你能讀取工作嗎? – PJT

+1

當然,我不會提交答案,否則:) –