我要求一次性坚持一对多关系的父母和子女 - 有问题的域对象是Project
和ProductLineItem
(Project
很多ProductLineItem
s。。
我创建了一个页面,用户可以将一行或多行添加到“产品”表格中,并希望每行都保留为新的ProductLineItem
(由Project
拥有)当用户提交表单时。
第一次保存域对象效果很好,但是当我尝试更新同一组对象时(通过更新页面),我在控制器中得到一个IndexOutOfBoundsException
projectInstance.properties = params
我可以通过在此productLineItems
中声明Project
集合来解决此问题 -
Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)
但是由于某种原因,这会阻止在我进行初始保存时填充ProductLineItem.project
属性。
我正在使用Grails 2.2.2。有什么想法吗?
答案 0 :(得分:1)
事实证明,将集合声明为包可能会阻止Grails设置外键约束。
通过更改
Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)
到
List<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)
我能够解决问题。
编辑:
对于它的价值,我不想使用列表(我总是遇到在使用列表进行一对多关系集合时出现“差距”的问题),所以我一直在摆弄我的代码。
如果我这样宣布这个包:
Collection<ProductLineItem> productLineItems = ListUtils.lazyList(new ArrayList(), {new ProductLineItem()} as org.apache.commons.collections.Factory)
然后未在子实体内设置对父级的引用。但是,如果我这样宣布这个包:
Collection productLineItems
然后它的作品!该系列也自动扩展!
仍在测试我的代码,但到目前为止看起来还不错。