0

我们不能在 Servlet 中使用 EntityManager 吗?像这样 :

@WebServlet(name = "ServletPrincipal", urlPatterns = { "/test" })
public class ServletPrincipal extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


EntityManagerFactory emf = Persistence.createEntityManagerFactory("todo");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
for (int i = 0; i < 10; i++) {
Voiture car = new Voiture(0, "b", "c");
em.persist(car);
}

em.getTransaction().commit();

Query q1 = em.createQuery("SELECT COUNT(v) FROM Voiture v");
System.out.println("Le nombre d'enregistrement: "
+ q1.getSingleResult());

TypedQuery<Voiture> query = em.createQuery("SELECT v FROM Voiture v",
Voiture.class);
List<Voiture> results = query.getResultList();
for (Voiture p : results) {
System.out.println(p.getMatricule());

}
// Close the database connection:
em.close();
emf.close();

    }

}

如果不能,那么如何在一个 servlet 中使用持久性?

为什么?

我使用 tomcate7、servlet3、jpa2 和 java EE 6 非常感谢

4

3 回答 3

0

使用@PersistenceContext 和@PersistenceUnit 来传递对EntityManager 和EntityManagerFactory 的引用也是一个好主意。还要考虑 EMFactory 是线程安全的,而 EM 不是。

于 2014-02-01T01:26:34.743 回答
0

在 Servlet 中使用 EntityManager 非常好。

因为您的 servlet 可以(并且可能会)同时服务多个请求,并且因为 EntityManager 不是线程安全的,所以您不应将 entityManager 的实例分配(也不注入)到 servlet 中的字段。

您可以并且可能应该做的是只创建一次 EntityManagerFactory 的实例并重用它。EntityManagerFactory 是创建成本高昂的对象,将其用于同时请求很好,因为它是线程安全的。

如果这个 servlet 只是你需要这个持久性单元的地方,你可以例如在 servlet 的 init-method 中打开 EntityManagerFactory 并在 destroy-method 中关闭它。

于 2012-05-31T16:24:45.877 回答
0

通常,将持久性代码保留在控制器 servlet 中并不是一个好主意。但是要回答您的问题,正如@Mikko Maunu正确所说,您可以在您的servlet 中使用实体管理器。

于 2012-06-01T08:24:22.587 回答