Grails数据与一对多关系绑定 - 链接回父节点丢失

时间:2013-09-25 15:14:41

标签: spring grails data-binding

在Grails 2.2.2应用程序中,我有一对多关系看起来像这样:

父:

class Client {
    ...
    String name
    static hasMany = [modelFieldInstances: ModelFieldInstance]
    ...
}

子:

class ModelFieldInstance {
    ...
    String name
    String value
    static belongsTo = [client: Client]
    ...
}

我正在尝试创建数据导入程序,以便用户可以导入包含其客户端记录的电子表格或csv。为此,我检查了grails scaffolding在标准脚手架控制器的Client方法中创建新save实例时使用的参数。

问题在于,当我尝试使用我的导入程序创建并保存新的Client实例时,保存子ModelFieldInstance,而不会引用父Client({ {1}} ClientModelFieldInstance都被保留了。)

在我的导入器中,我正在进行如下数据绑定:

Client client = new Client()
client.modelFieldInstances = ListUtils.lazyList(new ArrayList(), {new ModelFieldInstance()} as org.apache.commons.collections.Factory)
client.properties = properties
...
client.save()

我认为Grails脚手架控制器如何工作以及我的导入器如何工作之间唯一真正的区别是,在我的导入器中,我最初将modelFieldInstances集合设置为LazyList。但是,在我添加LazyList赋值之前,数据绑定正在发出如下错误:

Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Illegal attempt to get property 'modelFieldInstances' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Cannot get element with index 31 from Set of size 0, accessed using property path 'modelFieldInstances[31]'**

所以,我想问题是,当我看到它在给定属性映射的脚手架控制器中工作时,为什么数据绑定在我的数据导入器中不起作用。

1 个答案:

答案 0 :(得分:0)

作为一种解决方法,我实现了一种方法,该方法迭代modelFieldInstances集合中的所有项目,并手动将父项(client)分配给每个项目。这似乎工作正常,但我仍然不确定为什么grails数据绑定不会为我这样做。我想知道GrailsParameterMap ......

是否有一些神奇的事情发生了