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),它实际上非常简单。