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

时间:2016-01-14 10:48:58

标签: 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();
}
}

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

P.S。我看过他们使用@Stateless注释并注入实体管理器的一些示例,但我猜他们在那里使用EJB(我可能错了)而且我不想深入EJB现在。

1 个答案:

答案 0 :(得分:5)

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

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

  @PersistenceContext
  private EntityManager em;

// ... 

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