【发布时间】:2013-12-12 07:29:58
【问题描述】:
我已经使用 JSF+Spring+JPA 创建了示例项目。 我有 2 个实体 Customer 和 Order,其中客户可以有多个订单,因此 Customer 和 Order 之间的映射是 @OneToMany。 客户类别如下
@Entity
@NamedQueries
(
{
@NamedQuery(name=Contact.QUERY_FIND_ALL, query="FROM Contact"),
}
)
public class Customer
{
public final static String QUERY_FIND_ALL="findAll";
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private List<Order> orders;
public List<Order> getOrders()
{
return orders;
}
public void setOrders(List<Order> orders)
{
this.orders = orders;
}
}
我的视图如下所示
第一种情况:
- 我们加载所有客户并在屏幕上显示它们,并带有箭头 每条记录的前面,这发生在一个请求中。
-
现在,当最终用户单击箭头时,我们要显示所有订单 那个客户。
但即使我使用的是 OpenEntityManagerInView,我也会遇到延迟加载异常。
第二种情况:
- 如果我在一个请求中同时加载 Customer 和 Order,它工作正常。
如果我们在一个请求中加载父级,我们不能在第二个请求中加载其惰性关联,是否存在类似的情况?
为什么它不能在第一种情况下工作而在第二种情况下工作?
和
更重要的是,归档它的其他解决方案是什么?
【问题讨论】:
-
OpenSessionInViewFilter仅适用于您的页面一呈现会话关闭的单个请求。现在,当您单击箭头时,原始会话不再存在,因此延迟加载不起作用。 -
感谢 M. Deinum,但是否有文档说我们不能在 http 请求中使用 OpenEntityManagerInView?
-
上述类的 javadoc 和一般概念,即在视图中打开会话的工作方式。您想要的(或多或少)是对话中的开放视图。
标签: spring hibernate jsf jpa lazy-loading