4

內約束/ DB映射地圖繼Grails領域類:如何調整Grails領域類

class MyClass { 
    Map myMap 
} 

現在對於MYMAP的是,Grails自動在地圖中的元素創建新表。但是,如果我添加的元素太長(例如1024個字符),則會出現數據庫錯誤。

我可以通過某種方式告訴grails使myMap表中的相應列足夠大以允許更大的字符串,還是我必須在DB中手動執行此操作?

我已經嘗試過

static constraints = { 
    myMap(maxSize:1024) 
} 

不工作(如預期,因爲最大範圍應參照地圖的價值觀,而不是地圖本身)。

如果不通過限制,也許有辦法做到這一點通過

回答

5

我成功使用的另一種方法是將地圖推送到協作者域類的集合。

class DynaProperty { 
    String name 
    String value 

    static belongsTo = MyClass 
    static constraints = { 
     value(maxSize:4000) //Or whatever number is appropriate 
    } 
} 

然後在MyClass的:

class MyClass { 
    static hasMany = [dynaProperties:DynaProperty] 
} 

這是幾乎一張地圖,它可以讓你使用動態查找拉起單個條目的能力。

+0

謝謝,我終於這麼做了。我試圖覆蓋setter,以便您能夠直接傳遞Map作爲參數,但這不起作用 - 例如, public void setdynaProperties(Map map){map.each {this.addToDynaProperties(name:it.key.toString(),value:it.value.toString())}}。至少它不能使用構造函數。 – 2010-07-14 07:48:56

+0

酷,我很高興整體解決方案爲你工作。我很好奇你的二傳手是什麼錯誤?我知道我試圖用類型化的方法簽名來「僞造」一個屬性,如果我使用「def」(而不是「public void」),它就傾向於工作。但是這可能適用於吸氣人員而非套裝人員。 – 2010-07-14 18:41:34

0

你想完成什麼?地圖中總是有相同數量的東西嗎?如果有的話,你應該在你的課堂上定義這些屬性。

您可以看到目前的方法存在問題 - 直到運行時才能找出地圖中可能存在的內容,那麼grails如何才能爲其創建列?我很驚訝它甚至開始...

+2

其實,地圖支持得很好。鍵必須是字符串。不過,我認爲你需要修改底層的hibernate配置文件來調整爲地圖創建的表格。 參見http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.4%20Sets%2C%20Lists%20and%20Maps(5.2節)。 4套,列表和地圖 - 我無法獲得正確的鏈接。)。 – 2010-07-13 19:19:17