如何解决“未能延迟初始化角色集合”的 Hibernate 异常

新手上路,请多包涵

我有这个问题:

org.hibernate.LazyInitializationException:延迟初始化角色集合失败:mvc3.model.Topic.comments,没有会话或会话已关闭

这是模型:

 @Entity
@Table(name = "T_TOPIC")
public class Topic {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User author;

    @Enumerated(EnumType.STRING)
    private Tag topicTag;

    private String name;
    private String text;

    @OneToMany(mappedBy = "topic", cascade = CascadeType.ALL)
    private Collection<Comment> comments = new LinkedHashSet<Comment>();

    ...

    public Collection<Comment> getComments() {
           return comments;
    }

}

调用模型的控制器如下所示:

 @Controller
@RequestMapping(value = "/topic")
public class TopicController {

    @Autowired
    private TopicService service;

    private static final Logger logger = LoggerFactory.getLogger(TopicController.class);

    @RequestMapping(value = "/details/{topicId}", method = RequestMethod.GET)
    public ModelAndView details(@PathVariable(value="topicId") int id)
    {

            Topic topicById = service.findTopicByID(id);
            Collection<Comment> commentList = topicById.getComments();

            Hashtable modelData = new Hashtable();
            modelData.put("topic", topicById);
            modelData.put("commentList", commentList);

            return new ModelAndView("/topic/details", modelData);

     }

}

jsp 页面如下所示:

 <%@page import="com.epam.mvc3.helpers.Utils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
      <title>View Topic</title>
</head>
<body>

<ul>
<c:forEach items="${commentList}" var="item">
<jsp:useBean id="item" type="mvc3.model.Comment"/>
<li>${item.getText()}</li>

</c:forEach>
</ul>
</body>
</html>

查看 jsp 时出现异常。符合 c:forEach 循环

原文由 Eugene 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 602
2 个回答

如果您知道每次检索 Topic 时都想查看所有 Comment --- ,然后将 comments 的字段映射更改为:

 @OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<Comment>();

默认情况下,集合是延迟加载的,如果您想了解更多信息,请查看 内容。

原文由 darrengorman 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据我的经验,我有以下方法来解决著名的 LazyInitializationException:

(1) 使用Hibernate.initialize

 Hibernate.initialize(topics.getComments());

(2) 使用JOIN FETCH

您可以在 JPQL 中使用 JOIN FETCH 语法来显式提取子集合。这有点像 EAGER 抓取。

(3) 使用OpenSessionInViewFilter

LazyInitializationException 经常发生在视图层。如果使用 Spring 框架,则可以使用 OpenSessionInViewFilter。但是,我不建议您这样做。如果使用不当,可能会导致性能问题。

原文由 Boris 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题