【问题标题】:JPA Hibernate will not read (lazy loading) more then 1 member from an entityJPA Hibernate 不会从实体中读取(延迟加载)超过 1 个成员
【发布时间】:2016-09-09 12:48:34
【问题描述】:

您好,我有以下问题。

我需要收集未发货的订单以在 JSP 文件中读取它们。

当我发布(发布带有 id 的表单以发货...)时,当我在集合中有超过 1 个未发货的订单时出现异常: javax.el.E​​LException:读取实体类型上的“名称”时出错。Customer_$$_jvstf5f_1 根本原因: org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    if (request.getParameterValues("ship") != null) {
        List<Order> noStockUnshippedOrders = new ArrayList<>();

        for (String orderId : request.getParameterValues("ship")) {
            try {
                Long id = Long.parseLong(orderId);
                if (!orderService.setAsShipped(id)) {
                    noStockUnshippedOrders.add(orderService.read(id));
                }
            } catch (NumberFormatException e) {
                // IF NO LONG DO NOTHING
            }
        }
        request.setAttribute("noStockUnshippedOrders", noStockUnshippedOrders);
    }
    getUnshippedOrders(request, response);
    // GET ON WITH IT
    request.getRequestDispatcher(VIEW).forward(request, response);
}

这是我的 JSP 代码:

<!doctype html>
<c:forEach items='${noStockUnshippedOrders}' var='noStockUnshippedOrder'>
            <c:url value='/orderdetail.htm' var='orderDetailURL'>
                <c:param name='id' value="${noStockUnshippedOrder.id}" />
            </c:url>
            <tr>
                <td class="col-md-1 text-center"><a class="btn btn-danger"
                    href="<c:out value='${orderDetailURL}'/>" 
 role="button">${noStockUnshippedOrder.id}</a></td>
                <td class="col-md-1">${noStockUnshippedOrder.orderDate}</td>
                <td class="col-md-1">${noStockUnshippedOrder.requiredDate} 
 </td>
                <td class="col-md-2">${noStockUnshippedOrder.customer.name}
</td>
                <td>${noStockUnshippedOrder.comments}</td>
                <td class="col-md-2"><img
                    src="images/${noStockUnshippedOrder.status}.png">&nbsp;

${fn:toUpperCase(fn:substring(noStockUnshippedOrder.status, 0, 1))}${fn:toLowerCase(fn:substring(noStockUnshippedOrder.status, 1, -1))}
                </td>
            </tr>
        </c:forEach>

【问题讨论】:

    标签: java hibernate jsp


    【解决方案1】:

    这里发生错误的概率是 ${noStockUnshippedOrder.cmets} 或 order 的另一个属性(如果属性是 fetch = FetchType.LAZY),因为此时 Hibernate 会话已关闭。

    *第一种解决方案是使用策略 OpenSessionInViewFilter 策略。 见此链接:https://developer.jboss.org/wiki/OpenSessionInView

    *第二种解决方法是在Servlet中查找cmets(或其他属性lazy)的列表,例如。

    if (!orderService.setAsShipped(id)) {
        Order order = orderService.read(id);
        List<Comment> comments = commentService.findByOrder(order);
        order.setComments(comments);
        noStockUnshippedOrders.add(order);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2021-06-11
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多