我知道这个问题已经被问过很多次了,我已经阅读/尝试了我能找到的大多数解决方案。但是我找不到解决问题的确切方法。他们中的大多数都在调用save(),但我只得到列表。在groovy/grails中。
错误"failed to lazy initialize a collection, no session or session was closed"在return caseVisualImpairmentCauses
部分执行时发生。当caseVisualImpairmentCauses
包含value时,它返回错误"对象引用了未保存的瞬态实例-在刷新之前保存瞬态实例"。
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)
知道为什么会发生这个错误吗?
我能够通过将所有findbyId(), .get()和getbyId()更改为.read()来解决这个问题。似乎方法(find, get)已经在刷新,并且与调用.save()一样好。我还取出了从另一个服务调用的所有获取数据的方法(不能被.read()取代的方法,如findBYOtherproperty),并将其放在相同的方法中。这使得错误消失,而不需要我在离开服务之前强制保存对象。