在Rest / AngularJS上进行JPA延迟加载的最佳方法

时间:2014-09-10 18:33:28

标签: angularjs jpa eclipselink

对于一般性问题感到抱歉,但在开发一个安静的AngularJS应用程序时,是否还有一种方法可以继续使用JPA延迟加载实体。

在旧的JSF时代,只有当支持bean访问列表时,它才会正常工作。

我正在使用EclipseLink和Spring Data,使用Jersey来获得宁静的终点。

此致

2 个答案:

答案 0 :(得分:0)

通常,在请求生命周期内EntityManager被关闭之前,您必须触发实体的延迟加载。

为此,您可以使用“在视图中打开EntityManager”模式。 Spring提供了Filter您可以申请的OpenEntityManagerInViewFiltergetMyLazyCollection()(请阅读此处的文档:http://docs.spring.io/spring/docs/4.1.0.RELEASE/javadoc-api/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.html)。

或者,您可以在将其序列化为JSON之前手动调用JPA实体上的{{1}}。

答案 1 :(得分:0)

我认为最好的课程取决于以下内容。

  

您是否能够检索完全解析的实体,即所有实体   组件没有对性能产生负面影响?

如果答案是Yes,那么请使用JPA fetch option = eager来解析整个实体。

我答案是No。我会采用以下方法: -

1)将每个惰性JPA组件/关联明确地公开为sub-resource

e.g。

  @Entity
  public class Employee {
      @Id
      private long id;
      ...
      @OneToOne(fetch=FetchType.LAZY)
      @JoinColumn(name="ADDR_ID")
      private Address homeAddress;
      ...
    }
    @Entity
    public class Address{
    }

2)将服务作为控制器公开(虽然你可以将它们分开,但我不建议)

@RequestMapping(value="/api/employee")
@Controller
public class EmployeeSvc

       public Employee getEmployee(@PathVariable empID){
        .....
       } 

       @RequestMapping(value="{empID}/homeaddress")
       public Address getHomeAddress(@PathVariable empID){
          // will serve http://localhost:8080/api/employee/11111/homeaddress
          return this.getEmployee(empID).getHomeAddress();
           //make sure you are using 2nd Level cache - as you retrieve object twice         
       } 

}