对于一般性问题感到抱歉,但在开发一个安静的AngularJS应用程序时,是否还有一种方法可以继续使用JPA延迟加载实体。
在旧的JSF时代,只有当支持bean访问列表时,它才会正常工作。
我正在使用EclipseLink和Spring Data,使用Jersey来获得宁静的终点。
此致
我
答案 0 :(得分:0)
通常,在请求生命周期内EntityManager
被关闭之前,您必须触发实体的延迟加载。
为此,您可以使用“在视图中打开EntityManager”模式。 Spring提供了Filter
您可以申请的OpenEntityManagerInViewFilter
:getMyLazyCollection()
(请阅读此处的文档: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
}
}