2010-11-04 25 views
2

請看下面Grails領域類,這修改了設置器內的值,如果該對象被保存在第一時間(如果沒有ID):爲什麼Grails中的setter調用兩次保存?

class Idtest { 

    String name 

    void setName(String name) { 
    if(!this.id) 
     this.name = name + "TEST" 
    else 
     this.name = name 
    } 

} 

如果我生成視圖和控制器generate-all,啓動應用程序,並在生成的表單中輸入「hello」,「helloTESTTEST」被保存。

save功能如下:

def save = { 
    def idtestInstance = new Idtest(params) 
    if (idtestInstance.save(flush: true)) { 
     flash.message = "${message(code: 'default.created.message', args: [message(code: 'idtest.label', default: 'Idtest'), idtestInstance.id])}" 
     redirect(action: "show", id: idtestInstance.id) 
    } 
    else { 
     render(view: "create", model: [idtestInstance: idtestInstance]) 
    } 
} 

爲什麼叫兩倍的制定者?當您創建對象

回答

0

我相信,它被稱爲一次,它重新保存

然後,它會被稱爲當您檢索從數據庫中的對象。

所以..

在保存到該屬性設置數據庫,讓我們假設一個計數器=計數+ 1,所以現在一個保存到數據庫中。

當你從數據庫中檢索對象,域物體設定將被再次調用,從而增加計數器再次櫃檯++

這是所有的假設,因爲沒有控制代碼在這裏讓我們看看你創建和或保存的對象,所以不要來砸我,如果我完全脫落

+0

這是一個很好的想法,當從db讀取對象時再次調用setter,但對象應該有一個ID。 – deamon 2010-11-04 13:19:45

+0

@deamon你是對的!對不起,發佈控制器代碼.. – 2010-11-04 13:27:07

+1

我不認爲該ID是保證在其他屬性之前設置。顯然,它不是。 - 順便說一句,該類不*定義任何可以採用命名參數的構造函數。在內部,調用隱式的* nullary *構造函數,然後調用setter。 – robbbert 2010-11-04 19:15:13

相關問題