Grails 未能延迟初始化集合,未关闭任何会话或会话

Grails 未能延迟初始化集合,未关闭任何会话或会话,grails,groovy,lazy-loading,Grails,Groovy,Lazy Loading,我知道这已经被问了很多次,我已经阅读/尝试了我能找到的大多数解决方案。但我找不到解决我问题的确切办法。他们中的大多数人都在调用save(),但我只得到了列表。这是在groovy/grails中实现的 执行此代码时,会出现错误“未能延迟初始化集合,没有会话或会话已关闭”。返回案例VisualimPairmentCauses部分。当caseVisualImpairmentCauses包含值时,它返回错误“对象引用未保存的临时实例-在刷新之前保存临时实例” 知道为什么会发生这个错误吗?我可以通过将所有

我知道这已经被问了很多次,我已经阅读/尝试了我能找到的大多数解决方案。但我找不到解决我问题的确切办法。他们中的大多数人都在调用save(),但我只得到了列表。这是在groovy/grails中实现的

执行此代码时,会出现错误“未能延迟初始化集合,没有会话或会话已关闭”。返回案例VisualimPairmentCauses部分。当
caseVisualImpairmentCauses
包含值时,它返回错误“对象引用未保存的临时实例-在刷新之前保存临时实例”


知道为什么会发生这个错误吗?

我可以通过将所有findbyId()、.get()和getbyId()更改为.read()来解决这个问题。看起来这些方法(find、get)已经在刷新,就像调用.save()一样。我还取出了从另一个服务调用的所有获取数据的方法(不能用.read()代替的方法,比如findBYOtherproperty),并将其放在同一个方法中。这使错误消失,而我在离开服务之前没有强制先保存对象。

您在哪里调用此方法?因为我想获取数据库中已经存在的视觉障碍列表以及用户在离开/指导页面之前刚刚检查的视觉障碍。主页有几个重定向(添加客户端,添加联系人),我需要在这个过程中维护数据。这是在webflow中。您的域类中有自定义的getter/setter吗?我相信这是因为您正在实例化新对象,而不是在从服务方法返回之前保存它们(事务结束/hibernate尝试刷新实例)。我只是尝试获取数据,我不打算在webflow结束之前保存它
def List<CaseVisualImpairmentCause> bindVisualImpairmentCause(Long visualImpairmentPrimaryCauseId, ArrayList caseVisualImpairmentCausesList,
    String visualImpairmentOtherCause) {
    def caseVisualImpairmentCauses = []

    if (visualImpairmentPrimaryCauseId) {
        def visualImpairmentPrimaryCauseInstance = VisualImpairmentCause.get(visualImpairmentPrimaryCauseId)
        CaseVisualImpairmentCause caseVisualImpairmentPrimaryCause = new CaseVisualImpairmentCause(visualImpairmentCauseIdvisualImpairmentCause: visualImpairmentPrimaryCauseInstance)
        caseVisualImpairmentPrimaryCause.isPrimary = true
        caseVisualImpairmentCauses << caseVisualImpairmentPrimaryCause
    }
    caseVisualImpairmentCausesList.each {
        VisualImpairmentCause visualImpairmentCause = VisualImpairmentCause.get(it as Integer)
        CaseVisualImpairmentCause caseVisualImpairmentCause = new CaseVisualImpairmentCause(visualImpairmentCauseIdvisualImpairmentCause: visualImpairmentCause)
        if (it.equals('5')) {
            caseVisualImpairmentCause.caseVisualImpairmentCauseOther = visualImpairmentOtherCause
        }
        caseVisualImpairmentCauses.add(caseVisualImpairmentCause)
    }
    return caseVisualImpairmentCauses
}
    obpCaseInstance.visualImpairmentCauses = caseService.bindVisualImpairmentCause(visualImpairmentPrimaryCauseId, listOfCaseVisualImpairmentCauses, visualImpairmentOtherCause)