首先,我是JPA和Jax-rs的新手,我正在努力开发一项休息服务。所以我创建了一个资源类并对其进行了注释。
@Path("/companies")
public class CompanyResource {
private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("test");
@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Company> getCompanies() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
return new ArrayList<>();
}
@GET
@Path("{companyId}")
@Produces({MediaType.APPLICATION_JSON})
public Company getCompany(@PathParam("companyId") int id) {
return new Company();
}
}
根据我对jax-rs的理解,我将创建CompanyResource
的每个客户端请求实例,这意味着每次创建新的EntityManagerFactory
时,我认为这不是一个好主意,因为我只需要它来创建实体管理器,这可以只使用它的一个实例来完成。那么实现这一目标的正确方法是什么?或者可以为每个请求创建此工厂的新实例吗?
P.S。我看过他们使用@Stateless
注释并注入实体管理器的一些示例,但我猜他们在那里使用EJB
(我可能错了)而且我不想深入EJB
现在。
答案 0 :(得分:5)
我认为你应该注入entitymanager本身(而不是工厂),并让容器处理实例化和范围。我们通常做的是像
@Stateless
@Path("services")
public class MyServices {
@PersistenceContext
private EntityManager em;
// ...
除了@Stateless
(你应该使用哪种方式,没有必要深入了解EJB),它实际上非常简单。