2015-05-16 133 views
0

我有2個域類。 ParentDomain和Section。級聯更新未觸發

class ParentDomain { 
    String description 
    List sections 
    static hasMany = [sections:Section] 
} 



class Section { 

    String name 
    static belongsTo = [parentDomain : ParentDomain] 
} 

在當我設置(首次),它與在部分表下面的內容正確保存它的服務方法parentDomain.setSections(部分對象的列表)。

+----+---------+---------------+-------------+------------------+ 
| id | version | name   | parentdomain_id | sections_idx | 
+----+---------+---------------+-------------+------------------+ 
| 1 |  0 | Section 1  |   6  |  0  | 
| 2 |  0 | Section 1  |   6  |  0  | 
+----+---------+---------------+-----------------+--------------+ 

當我獲得/更新從DB父域對象和新段設置對象列表parentDomain.setSections(新區段對象列表),然後運行parentDomain.save(沖洗:真)不從表中刪除舊的部分對象,但除了像這樣的舊部分之外,還添加了新的部分條目。

+----+---------+---------------+-------------+------------------+ 
| id | version | name   | parentdomain_id | sections_idx | 
+----+---------+---------------+-------------+------------------+ 
| 1 |  0 | Section 1  |   6  |  0  | 
| 2 |  0 | Section 2  |   6  |  1  | 
| 3 |  0 | Section 3  |   6  |  0  | 
| 4 |  0 | Section 4  |   6  |  1  | 
+----+---------+---------------+-----------------+--------------+ 

據我瞭解,它應該只保留2節的對象,而更新和刪除由於級聯更新舊的。同樣奇怪的是,當我從db中獲取父域對象實例時,我只能得到與它關聯的最後2個section對象。是否因爲sections_idx?

回答

1

發生這種情況是因爲您在hasMany屬性中使用了不正確的方式添加數據。而不是使用setSections()方法,您應該使用addToSections()方法(addTo*)。

並且刪除不是自動的(除非你自動綁定(不知道這個列表場景))。您必須使用removeFromSections()方法(removeFrom*)從父級手動刪除子對象。

Edit_____________________________________________________________

我不知道這些方法的內部程序,但addToSections方法是一種簡單的setter方法,不具有與表的狀態做。因此,在你的情況下,它再次從0sections_idx列開始獨立於此,該索引已存在(* _idx列是我們在hasMany中使用List時最重要的列,就像你的情況一樣。它維護子索引該列表),因此第二次在parentDomain.sections中獲得兩個實例,而不是四個。

雖然*addTo方法(GORM)幫助保持新條目的索引_idx從表中查找。

並且setter無法刪除親子關聯,removeFrom*就是爲了這個。

+0

感謝您的回覆。實際上,自從幾周以來我一直在使用GORM。我主要使用休眠Pojo的數據持久性。我知道addTo和removeFrom *,但我不明白爲什麼設置方法是不正確的方式,因爲我想覆蓋集合。我認爲addTo *會附加到現有的列表。同樣在hibernate中,如果我們覆蓋集合,舊的集合將被刪除。我期望GORM能夠以這種方式工作,因爲它也是建立在休眠之上的。 –

+0

我明白了idx專欄的意義。列表保留了訂單,因此它需要添加_idx列來保持這一點。我會更深入地研究它,並將其與休眠進行比較。感謝曼尼什;)+1爲您的答案 –