【问题标题】:OpenEntityManagerInView is not working with JSFOpenEntityManagerInView 不适用于 JSF
【发布时间】: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;
        }
    }

我的视图如下所示

第一种情况:

  1. 我们加载所有客户并在屏幕上显示它们,并带有箭头 每条记录的前面,这发生在一个请求中。
  2. 现在,当最终用户单击箭头时,我们要显示所有订单 那个客户。

    但即使我使用的是 OpenEntityManagerInView,我也会遇到延迟加载异常。

第二种情况:

  1. 如果我在一个请求中同时加载 Customer 和 Order,它工作正常。

如果我们在一个请求中加载父级,我们不能在第二个请求中加载其惰性关联,是否存在类似的情况?

为什么它不能在第一种情况下工作而在第二种情况下工作?

更重要的是,归档它的其他解决方案是什么?

【问题讨论】:

  • OpenSessionInViewFilter 仅适用于您的页面一呈现会话关闭的单个请求。现在,当您单击箭头时,原始会话不再存在,因此延迟加载不起作用。
  • 感谢 M. Deinum,但是否有文档说我们不能在 http 请求中使用 OpenEntityManagerInView?
  • 上述类的 javadoc 和一般概念,即在视图中打开会话的工作方式。您想要的(或多或少)是对话中的开放视图。

标签: spring hibernate jsf jpa lazy-loading


【解决方案1】:

当您在数据访问层类(例如 CustomerDAO)上加载客户时,您必须获得每个子属性中的至少一个以绕过惰性代理,它可能看起来像这样

public class CustomerDAO{

       public Customer getCustomer(String custId){
            Customer cust = //your method to retrieve customer
            List<Order> orders = cust.getOrders();
            for(Order ord:orders){
                  ord.getOrderName(); // you have to get at least one of each child property to bypass lazy proxy
            }
       }
    }

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多