覆盖Setter& Getter Domain类grails

时间:2012-08-30 19:21:44

标签: grails groovy

我正在尝试覆盖域类的getter和setter。这样做的理由是我不必重新编写代码中很多地方的这个域类的初始化。

我有一个域类“银行”,曾经有一个'地址',它被初始化如下: 新银行(地址:地址)

现在,我需要多个地址,所以我有一个映射类BankAddress和Bank现在有'地址'的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)
}

问题是,当我的setter被调用时,该函数的'instance'参数为空,使得在保存时失败 - new Bank(address:someAddress): 'AddressId',表'someDB.Config.BankAddress';列不允许空值。 INSERT失败。

为什么setter有空参数? ...我很喜欢groovy&它的动态性

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

在您的setter中,您正在创建一个新的BankAddress对象,然后执行save(flush:true)BankAddress对象的一个​​属性是提交的Address对象。如果提交的Address对象尚未保存到数据库,则新的BankAddress对象将尝试在数据库的外键列中保存null id,这将失败因为外键列不可为空。

确保已提交的Address对象已保留到数据库中,因此它具有主键ID,或者延迟将新BankAddress对象保留到以后。