0

我需要一次性保持一对多关系的父级和子级 - 有问题的域对象是ProjectProductLineItem(aProject有很多ProductLineItems)。

我创建了一个页面,用户可以在其中向“产品”表添加一行或多行,并且我希望在用户提交表单时每一行都作为新的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。有任何想法吗?

4

1 回答 1

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

那么它的工作原理!集合也会自动扩展!

仍在测试我的代码,但到目前为止看起来不错。

于 2013-07-02T13:32:51.097 回答