2016-01-14 3 views
0

Прежде всего я новичок в JPA и Jax-rs, я пытаюсь разработать сервис отдыха. Поэтому я создал класс ресурсов и аннотировал его.JPA создать фабрику управления сущностями для каждого запроса?

@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 и вводят Entity Manager, но я предполагаю, что они используют EJB там (возможно, я ошибаюсь), и я не хочу углубляться в EJB прямо сейчас.

+0

Не следует создавать экземпляры EM или EMF. Используйте IDE, например Netbeans или Eclispes, и вы можете создать веб-сервис Entire Resfull и посмотреть, как он моделируется. Https://netbeans.org/kb/71/websvc/rest.html – vels4j

+0

- это ваша среда Java EE или SE (последняя быть Tomcat, я думаю)? –

+0

@francescoforesti Java EE, GlassFish как сервер приложений. – Asiat

ответ

5

Я думаю, что вы должны ввести сам entitymanager (а не на заводе), и пусть контейнер позаботится об экземплярах и областях. Что мы обычно делаем что-то вроде

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

    @PersistenceContext 
    private EntityManager em; 

// ... 

отдельно от @Stateless (который IMHO вы должны использовать, нет никакой необходимости, чтобы получить глубоко в EJB для этого), это на самом деле довольно просто.