2012-08-30 29 views
0

我想覆蓋域類的getter和setter。理性的做法是,我不必重新初始化在代碼中許多地方的這個領域類。覆蓋二傳手和吸氣域類grails

我有一個域類,曾經有一個「地址」銀行',它被如下初始化: 新銀行(地址:地址)

現在,我需要多個地址,所以我有一個映射類BankAddress和銀行現在有「地址」 BankAddress

的列表要保持初始化相同的「新銀行(地址:地址)」,我重寫「的getAddress」和「setAddress」這樣的:

Address getAddress(){ 
    if(addresses?.size()>0){ 
     addresses.asList().get(0).getAddress() 
    }else{ 
     return null 
    } 
} 

void setAddress(Address instance){ 
    if(addresses?.size()>0){ 
     addresses*.delete() 
     addresses.clear() 
    } 

    def bankAddress = new BankAddress(address: instance, bank: this, isPrimary: true).save(flush: true) 
    addToAddresses(bankAddress) 
} 

問題是whi我的setter被調用,函數的'實例'參數是空的使得在保存時失敗 - 新的Bank(地址:someAddress): 'AddressId','someDB.Config.BankAddress';列不允許有空值。 INSERT失敗。

引路人如何有空論據? ......我newbee Groovy的&其動態特性

感謝你的幫助

回答

1

在你的setter,你要創建一個新的BankAddress對象,然後做一個save(flush:true)BankAddress對象的其中一個屬性是提交的Address對象。如果已提交的Address對象尚未保存到數據庫中,則新的BankAddress對象將嘗試在數據庫的外鍵列中保存一個null id,由於外鍵列不可爲空,所以該對象將失敗。

確保您提交的Address對象已被持久保存到數據庫,因此它具有主鍵ID,或者延遲保留新對象,直到更晚。

+0

我刪除了.save(Flush:true),它會延遲BankAddress的持續時間,並在根據您的建議給出銀行地址之前保存flush地址,並且它可以正常工作。謝謝你的詳細解答 – latvian