JPA为每个请求创建实体管理器工厂?

Asi*_*iat 0 java jpa jax-rs

首先,我是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();
}
}
Run Code Online (Sandbox Code Playgroud)

从我对每个客户端请求实例的jax-rs的理解CompanyResource,这意味着每次EntityManagerFactory创建新的,我想这不是一个好主意,因为我只需要它来创建实体管理器,这可能是仅使用它的一个实例完成.那么实现这个目标的正确方法是什么?或者可以为每个请求创建此工厂的新实例吗?

PS我已经看到一些例子,他们使用@Stateless注释并注入实体管理器,但我猜他们EJB在那里使用(我可能是错的),我现在不想深入EJB.

fra*_*sti 5

我认为你应该注入entitymanager本身(而不是工厂),并让容器负责实例化和范围.我们通常做的是像

@Stateless
@Path("services")
public class MyServices {

  @PersistenceContext
  private EntityManager em;

// ... 
Run Code Online (Sandbox Code Playgroud)

除了@Stateless(你应该使用哪种方法,没有必要深入了解EJB),它实际上非常简单.