2012-04-16 54 views
0

目前我遇到了一些麻煩,在Grails中創建了單向關係。Grails hasOne unidirectional

我有一個類屬性地址廁所。 這個地址是一個單獨的課程。 如果地址關聯的廁所對象被刪除,則地址可以在理論上仍然存在。 如果地址被刪除,廁所也會保留。

GORM的hasOne不是我所需要的,因爲它創建了一個雙向關係。

定義類型類的屬性只能導致非持續地址(儘管它自己的表) - 這意味着,該地址上廁所,對象的關聯不存在

我沒有真正熟悉這些類型的關係,所以我會很感激的溶液或另一種方式來完成我的目標

希望我的問題是明確的 - 如果不發表評論,我會嘗試添加更多的解釋

+0

如果地址被刪除怎麼辦?廁所會保留還是刪除? – evanwong 2012-04-16 21:43:52

+0

它會留下來。這是一種寬鬆的關係(我不知道這是否解釋了這種情況)。 – Zobbl 2012-04-16 21:52:41

回答

0

找到解決方案。

我遺漏的是在廁所類中實現了一個接口。

問題是(作爲提醒)廁所類中地址的關係沒有保存到數據庫中。

這是接口本身的一個問題 - 在這個接口中,getter和setter被定義並且必須被實現(接口的工作方式 - 顯然)。這裏的問題是,地址屬性的設置者預計類型爲IAddress

我重載setter也接收Address類型的參數。

通過此更改,ToiletAddress之間的關係正確保存到數據庫 - 地址的ID保存在廁所的表格中。

我認爲二傳手的定義僅僅是一個錯誤(我有接口上沒有影響),但與此解決方法,我可以得到它的工作反正

希望這樣的解釋幫助別人了。

0

如果廁所上的地址是一個簡單的關聯,沒有hasOnebelongsTo映射,則不會級聯操作。

這意味着您必須保存地址,將其分配給toilet.address,並保存廁所。

+0

感謝您的建議,但這並不奏效 - 這種關係只是沒有出現在數據庫中。 這是一個學生項目,因此我們能夠改變需求。 – Zobbl 2012-04-17 19:57:32

1

http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html

5.3.3瞭解級聯更新和刪除

至關重要的是,您瞭解如何級聯更新和使用GORM時刪除工作服用。要記住的關鍵部分是belongsTo設置,它控制哪個類「擁有」一種關係。 如果您定義belongsTo更新和刪除,它是否是一對一,一對多或多對多將從擁有類級聯到其擁有者(關係的另一方)。

如果您未定義belongsTo,則不會發生級聯,您將不得不手動保存每個對象。

所以......如果你不使用belongsTo,那麼如果你手動保存每個對象,你應該沒有問題。

0

爲什麼不能建立關聯模型?

class ToiletAddress { 
    Toilet toilet 
    Address address 
    ... 
} 

...然後將您的邏輯簡單地包裝到您爲廁所分配地址並刪除廁所或地址的服務中。

使用約束可以定義它是什麼樣的關聯。例如1-1,1-n(兩邊)和n-m

static constraints = { 
    address unique: ['toilet'] 
    toilet validator: {val, obj -> ... } 
}