請看下面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])
}
}
爲什麼叫兩倍的制定者?當您創建對象
這是一個很好的想法,當從db讀取對象時再次調用setter,但對象應該有一個ID。 – deamon 2010-11-04 13:19:45
@deamon你是對的!對不起,發佈控制器代碼.. – 2010-11-04 13:27:07
我不認爲該ID是保證在其他屬性之前設置。顯然,它不是。 - 順便說一句,該類不*定義任何可以採用命名參數的構造函數。在內部,調用隱式的* nullary *構造函數,然後調用setter。 – robbbert 2010-11-04 19:15:13