grails-更新父项和子项抛出越界异常

grails-更新父项和子项抛出越界异常,grails,gorm,Grails,Gorm,我有两个班,一个是家长班: class parentItem{ User user Date startTime Date endTime ------ Date dateCreated Date lastUpdated static hasMany = [ childItems: ChildItem ] 还有一个儿童班 class ChildItem{ stat

我有两个班,一个是家长班:

class parentItem{
     User        user

     Date    startTime
     Date   endTime
     ------

     Date        dateCreated
     Date        lastUpdated

     static hasMany = [ childItems: ChildItem ]
还有一个儿童班

class ChildItem{


static belongsTo = [parent : ParentItem]    
---------
Date time
Date dateCreated
Date lastUpdated
在允许编辑项目的gsp文件中,我有一个表,其中的行如下所示:

<table id="childDataTable" class="childData">
<g:each in="${ParentInstance?.childItems?.sort{it.id}}" var="childItem" status="i">
<tr class="childRow">
            <td>
         <g:hiddenField name="childItems[${i}].id" value="${childItem.id}"/</td>
         ------
        <td>
        <g:textField name="childItems[${i}].time" class="time" value="${childItem.time}"/>

            </td>               
            <td><a href="#" class="removeButton">&#10006;</a></td>  
        </tr>
    </g:each>
        </table>
Index: 1, Size: 1. Stacktrace follows:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at com.sexingtechnologies.laboratory.ParentItemController$_closure7$$EOChoLzu.doCall(ParentItemController.groovy:158)
at grails.plugin.multitenant.core.servlet.CurrentTenantServletFilter.doFilter(CurrentTenantServletFilter.java:53)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
我已经试过了

def parentInstance = ParentItem.get(params.id
parentInstance.properties = params
这两种方式我都会得到一个越界的例外

在我有两个子项的情况下,消息如下所示:

<table id="childDataTable" class="childData">
<g:each in="${ParentInstance?.childItems?.sort{it.id}}" var="childItem" status="i">
<tr class="childRow">
            <td>
         <g:hiddenField name="childItems[${i}].id" value="${childItem.id}"/</td>
         ------
        <td>
        <g:textField name="childItems[${i}].time" class="time" value="${childItem.time}"/>

            </td>               
            <td><a href="#" class="removeButton">&#10006;</a></td>  
        </tr>
    </g:each>
        </table>
Index: 1, Size: 1. Stacktrace follows:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at com.sexingtechnologies.laboratory.ParentItemController$_closure7$$EOChoLzu.doCall(ParentItemController.groovy:158)
at grails.plugin.multitenant.core.servlet.CurrentTenantServletFilter.doFilter(CurrentTenantServletFilter.java:53)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
我不知道错误在哪里,也不知道如何解决

我试图从params映射中提取childItems,但未能成功


感谢您的任何帮助

也许您可以在数据绑定之前初始化childItems,如下所示:

def parentInstance = ParentItem.get(params.id)
parentInstance.childItems = [].withDefault { new ChildItem() }
bindData(parentInstance, params)

.

效果很好。我担心它会添加新的记录并保留原始记录,但我欣喜若狂地发现它确实只是更新了记录。非常感谢你的帮助!是的,它只访问要更新的内容但是,如果您删除了使用id隐藏的输入,它将创建新的输入。很高兴它成功了,不客气。这个方法的问题是它没有更新传入的所有实体。它先做第一个,然后做第二个两次,然后完全跳过第三个。