【问题标题】:Spring OpenentityManagerInViewFilter alternativeSpring OpenentityManagerInViewFilter 替代方案
【发布时间】:2013-04-29 09:37:18
【问题描述】:

由于中提到的问题: Why not to use Spring's OpenEntityManagerInViewFilter

http://heapdump.wordpress.com/2010/04/04/should-i-use-open-session-in-view/

我想使用 Springs OpenentityManagerInViewFilter 的替代方法。这绝对是一个性能问题。如果我禁用 OpenentityManagerInViewFilter 我偶尔会收到错误:

LazyInitializationException:42 - failed to lazily initialize a collection 

【问题讨论】:

    标签: spring hibernate jpa ejb-3.0


    【解决方案1】:

    过滤器的一种替代方法是在通过请求将它们发送到视图之前访问延迟加载的集合中的所有元素。但是,此时您应该质疑是否需要急切地获取这些属性。

    这里有一些伪代码来演示。

       //Inside controller
       Department dept = dao.findDepartment(id);
    
       //This will load the entities, avoiding the exception.
       for(Employee e: dept.getEmployees()){ //Assume employees are lazy loaded
         e.getName();
       }
    
       request.setAttribute("department", dept); //In Spring this could be the model
    

    【讨论】:

    • 谢谢凯文。但这不是一个恰当的解决方案。考虑到我们的应用程序非常庞大,我们不能继续在代码中到处更改它。更微妙的方法是使用某种 DTO 或类似的东西。但我们暂时保持原样。无论如何,急切地获取也不是一个好的解决方案。
    • @avijendr Checkout the book Pro JPA2 它有一些解决这个问题的方法,我相信 EntityManager 章节。我暂时没有。