2015-05-16 92 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为您的答案 –