gpt4 book ai didi

java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序

转载 作者:行者123 更新时间:2023-12-01 11:57:36 27 4
gpt4 key购买 nike

用户实体类:

@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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com