JPA 为每个请求创建实体管理器工厂?
JPA create entity manager factory for every request?
首先,我是 JPA 和 Jax-rs 的新手,我正在尝试开发休息服务。所以我创建了一个资源 class 并对其进行了注释。
@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
现在。
我认为您应该注入 entitymanager 本身(而不是工厂),并让容器负责实例化和作用域。我们通常做的是
@Stateless
@Path("services")
public class MyServices {
@PersistenceContext
private EntityManager em;
// ...
除了 @Stateless
(恕我直言,您无需为此深入研究 EJB),它实际上非常简单。
首先,我是 JPA 和 Jax-rs 的新手,我正在尝试开发休息服务。所以我创建了一个资源 class 并对其进行了注释。
@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
现在。
我认为您应该注入 entitymanager 本身(而不是工厂),并让容器负责实例化和作用域。我们通常做的是
@Stateless
@Path("services")
public class MyServices {
@PersistenceContext
private EntityManager em;
// ...
除了 @Stateless
(恕我直言,您无需为此深入研究 EJB),它实际上非常简单。