用户实体类:
@Entity
public class User implements Serializable {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public List<Site> sites;
访问数据库的外观类:
@Stateless
public class UserFacade extends AbstractFacade<User, Long> {
@PersistenceContext
private EntityManager em;
...
}
用户注入(inject)的资源类:
@RequestScoped
public class Resource {
@Inject
UserFacade userFacade;
@Inject
HttpServletRequest request;
@Produces
public User getUser() {
final String name = request.getUserPrincipal().getName();
// ... find user in database ...
}
}
和 Jersey 处理程序:
@Stateless
@Path("/sites")
public class Sites {
@EJB
SiteFacade siteFacade;
@Inject
User user;
...
现在的问题是:
当我想访问 user.sites 列表时,出现延迟加载异常。但显然因为 User 由 RequestScoped 提供者注入(inject),它应该使用相同的 EntityManager session 刷新每个请求。对吗?
我是否可以将每个休息请求的用户实体注入(inject)休息处理程序类?
最佳答案
EntityManager
绑定(bind)到事务,而不是请求范围。
因此,User
生产者方法和您的 Sites
业务方法在两个不同的事务中调用,这解释了 LazyLoadException
。
关于java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28315409/