“未能延迟初始化角色集合:mvc3.model.Topic.comments,没有会话或会话被关闭”Hibernate 异常:综合指南
此异常在 Hibernate 环境中常见,突出显示了访问未初始化数据的问题。了解原因并找到正确的解决方案对于解决此错误至关重要。
理解问题:
在 Hibernate 中,数据检索使用立即加载(急切加载)的组合抓取)和延迟加载(延迟抓取)。默认情况下,集合和关联是延迟获取的,这意味着它们仅在有特殊请求时才从数据库加载。
在给定的场景中,Topic 实体类包含评论集合(评论字段)。当在会话外或会话关闭后访问此集合时,Hibernate 会抛出“无法延迟初始化角色集合”异常。
研究代码:
提供的代码包括Topic实体类、控制器(TopicController)和JSP视图(details.jsp)。 TopicController 方法(详细信息)通过 ID 检索主题(Topic 实例)并检索评论集合 (topicById.getComments())。然后该集合被传递到 JSP 视图。
分析 JSP 视图:
JSP 视图使用 JSTL c:forEach 循环来迭代评论集合。此行将项目引用为 item:
<c:forEach items="${commentList}" var="item">
异常原因:
发生异常是因为评论集合尚未初始化。由于 JSP 视图位于 Hibernate 会话之外,因此尝试访问集合会导致“无法延迟初始化角色集合”错误。
解决方案:Eager Fetching
要解决此异常,可以采用急切获取。这涉及到从数据库检索主题时加载评论集合以及主题。在Topic实体类中,修改comments字段如下:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL) private Collection<Comment> comments = new LinkedHashSet<Comment>();
这样做,Hibernate将在主题加载时立即获取评论集合。这消除了延迟初始化的需要并解决了异常。
急切获取的替代方案:
在某些情况下,急切获取可能不是首选解决方案,因为它由于加载的数据过多,可能会导致性能下降。替代方案包括:
了解延迟加载和含义:
延迟加载是一项旨在通过仅在需要时加载数据来提高性能的功能。但是,它需要打开一个会话以进行初始化。如果会话关闭或未打开,访问未初始化的集合将导致“无法延迟初始化集合”异常。
以上是如何解决Hibernate异常'未能延迟初始化角色集合”?的详细内容。更多信息请关注PHP中文网其他相关文章!