2013-08-21 86 views
0

我想在Grails中創建一個雙向多對一的關係,在兩個方向都有非級聯刪除。我的域名看起來像:Grails一對多刪除沒有級聯

class Asset { 
    static hasMany = [ hosts: Host ] 

    static mapping = { 
     hosts cascade: 'save-update' 
    } 
} 

class Host { 
    Asset asset 
} 

這刪除主機時正常工作(資產仍然),但是當我嘗試刪除的資產,我從DB完整性約束錯誤。我試着改變Host類的定義來使用belongsTo,但是不能讓它工作。任何幫助將是偉大的!謝謝!

+0

你使用了哪個數據庫? –

+0

嘗試在'Host'的'asset'屬性上添加'nullable:true'? –

+0

我在本地開發中使用hsqldb。我有它設置爲可空:真,只是不知道爲什麼我仍然得到錯誤.. – Nisrak

回答

0

我結束了寫的資產控制器刪除刪除資產本身之前,從所有主機對資產的所有引用我自己刪除()動作找到一個解決辦法:

def delete() { 
    def assetInstance = Asset.get(params.id)   
    assetInstance.hosts.each { theHost -> 
     theHost.asset = null 
     theHost.save() 
    } 
    if(!assetInstance.hasErrors() && assetInstance.delete()) { 
     redirect(action: "list") 
    } 
    else { 
     redirect(url: "/asset/show?id=${assetInstance.id}") 
    } 
} 

這消除了錯誤還可以防止父母(資產)被刪除時子項(主機)被刪除。

0

你有父(資產)和兒童(主機)班以下規則/屬性:

  1. 父母有孩子
  2. 兒童不存在可以不父(雙向)
  3. 父母無法移除子女

您的困境是您希望能夠移除父 - 但是您將違反規則#2。即使有了映射表,我也不認爲你可以做你想問的問題。我從來沒有過這種使用情況下,如果沒有重新設計太多的電流模式,我的猜測是,你必須:

  1. 作爲@JamesKleeh指出 - 允許在Host.asset爲空的 - 基本上兒童可以在不父
  2. 存在,或允許父刪除兒童(即級聯刪除)
+0

我試圖讓你的解決方案#1但可爲空:true仍然導致錯誤消息。我設法讓解決方案#2工作,但如果用戶不小心刪除了一個資產(有很多主機分配給它),這可能會成爲問題。 – Nisrak

0

這是一個many-to-many的關係,這在GORM將實際工作,你所希望的方式:你可以添加hostsAsset所有者並安全地刪除Asset而不影響hosts