Java Grails Hibernate会话问题-未能延迟初始化集合

Java Grails Hibernate会话问题-未能延迟初始化集合,java,hibernate,grails,grails-domain-class,Java,Hibernate,Grails,Grails Domain Class,错误: 错误500:null Servlet: URI: 异常消息:未能延迟初始化角色集合:Student.lockers,未关闭任何会话或会话 原因:执行标记时出错:执行标记时出错:未能延迟初始化角色集合:com.itzik.User.carts,grails app/views/shared/_navigation上未关闭任何会话或会话。grails app/views/layouts/home上的gsp:18。gsp:26 所以我有一个学生(有很多储物柜)。现在,当学生登录安全服务时,将

错误:

错误500:null
Servlet:
URI:
异常消息:未能延迟初始化角色集合:Student.lockers,未关闭任何会话或会话
原因:执行标记时出错:执行标记时出错:未能延迟初始化角色集合:com.itzik.User.carts,grails app/views/shared/_navigation上未关闭任何会话或会话。grails app/views/layouts/home上的gsp:18。gsp:26

所以我有一个学生(有很多储物柜)。现在,当学生登录安全服务时,将处理将他们放入会话的问题。然后我的主控制器检查他们是否有活动的储物柜。如果不是,它会为他们创建一个。现在,由于某种原因,它扼杀了学生与储物柜的关系

您有几种选择:

  • 使用
    fetch=FetchType.EAGER
    -如果集合不太可能包含太多的对象,而这些对象又包含其他集合,那么这是最简单的选择-您只需将它们与它们的所有者一起从数据库中取出即可

  • 使用-这将需要一些配置时间,但您最终可能需要它,即使不是针对这种特定情况。不过,我不能确切地告诉您如何在grails中配置OSIV

  • 在会话关闭(以及提交事务之前)之前使用
    Hibernate.initialize(collection)
    ——这是手动操作,会污染代码,因此不太可取


你能解释一下这些选项的好处吗?@Josh K-马上查看我的帖子
Error 500: null
Servlet: 
URI: 
Exception Message: failed to lazily initialize a collection of role: Student.lockers, no session or session was closed 
Caused by: Error executing tag <g:render>: Error executing tag <g:link>: failed to lazily initialize a collection of role: com.itzik.User.carts, no session or session was closed at grails-app/views/shared/_navigation.gsp:18 at grails-app/views/layouts/home.gsp:26